9

Androidアプリのオプションメニューの背景色を変更しようとしました。ActionBarSherlockライブラリを使用しています。オプションメニューの背景色を変更するためにこのコードを試しました

https://stackoverflow.com/a/8475357/584095

しかし、「java.lang.illegalstateexception:ファクトリはすでにこのlayoutinflaterに設定されています」という例外が発生しました。

LayoutInflater.setFactory();

このコードの何が問題なのかわかりません。誰かがこの問題を解決するのを手伝ってくれますか?

4

5 に答える 5

6

バージョン 22.1.0 以降、サポート ライブラリに変更がありました。

を呼び出そうとすると、IllegalStateException が発生します。getLayoutInflater().setFactory()

新しいAPIを使用する必要があります

または単に古いバージョンを使用する

  • com.android.support:appcompat-v7:22.0.0
  • com.android.support:appcompat-v4:22.0.0
于 2015-04-27T18:27:41.147 に答える
5

これは、互換性ライブラリを使用しているために発生します。プラットフォーム固有のレイアウトを処理するために独自のファクトリを設定します。super.onCreate()を呼び出す前に、onCreate()メソッドで独自のファクトリを設定してみてください。これにより、互換性ライブラリがファクトリをオーバーライドできなくなり、xmlファイルからフラグメントを拡張できなくなりますが、スタイル設定は機能するはずです。

于 2013-01-22T13:23:11.933 に答える
5

互換性ライブラリの動作を維持し、「java.lang.illegalstateexception: このレイアウトインフレータにファクトリが既に設定されています」を回避するには、すでに設定されているファクトリへの最終参照を取得し、独自の Factory.onCreateView 内でその onCreateView を呼び出す必要があります。その前に、イントロスペクション トリックを使用して、もう一度 Factory を LayoutInflater に設定できるようにする必要があります。

LayoutInflater layoutInflater = getLayoutInflater();
final Factory existingFactory = layoutInflater.getFactory();
// use introspection to allow a new Factory to be set
try {
    Field field = LayoutInflater.class.getDeclaredField("mFactorySet");
    field.setAccessible(true);
    field.setBoolean(layoutInflater, false);
    getLayoutInflater().setFactory(new Factory() {
        @Override
        public View onCreateView(String name, final Context context, AttributeSet attrs) {
            View view = null;
            // if a factory was already set, we use the returned view
            if (existingFactory != null) {
                view = existingFactory.onCreateView(name, context, attrs);
            }
            // do whatever you want with the null or non-null view
            // such as expanding 'IconMenuItemView' and changing its style
            // or anything else...
            // and return the view
            return view;
        }
    });
} catch (NoSuchFieldException e) {
    // ...
} catch (IllegalArgumentException e) {
    // ...
} catch (IllegalAccessException e) {
    // ...
}
于 2013-09-04T05:51:26.947 に答える
3

これは私のために働く:

LayoutInflater inflater = LayoutInflater.from(context);
if (inflater.getFactory() != null) {
    inflater = inflater.cloneInContext(context);
}
inflater.setFactory(factory);
于 2014-08-29T02:37:33.623 に答える