9

私はアンドロイドアプリでオプションメニューの背景色を変更しようとしました。私はActionBarSherlockライブラリを使用しています。ラインjava.lang.illegalstateexception:工場が既にこのレイアウトプラットフォームに設定されています

で:私は、私は例外「工場はすでにこのlayoutinflaterに設定されているjava.lang.illegalstateexception」になってしまった

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

しかし、オプションメニューの背景色を変更するため、このコードを試してみました

LayoutInflater.setFactory();

このコードで何が間違っているのか分かりません。この問題を解決するのに誰も助けてくれますか?

答えて

4

これは、互換性ライブラリを使用しているために発生します。プラットフォーム固有のレイアウトに対応する独自のFactoryを設定します。 super.onCreate()を呼び出す前に、onCreate()メソッドで独自のファクトリを設定しようとする場合があります。これにより、互換性ライブラリがファクトリをオーバーライドできなくなり、XMLファイルからフラグメントを展開することができなくなりますが、スタイリングは機能します。

5

互換性ライブラリを有効にして、 "java.lang.illegalstateexception:このレイアウトプラットフォームで既にファクトリが設定されている"ことを避けるには、既に設定されているFactoryへの最終参照を取得し、onCreateViewを独自のFactoryで呼び出します。 onCreateView。その前にイントロスペクションのトリックは、あなたが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) { 
    // ... 
} 
+1

動作しません。 android.view.InflateException:バイナリXMLファイル行#17:com.android.internal.view.menu.ActionMenuItemView " – MSIslam

+0

実際に例外はスローされませんでしたが、テキストの色はまだグレーです:( –

2

これが私の作品:

LayoutInflater inflater = LayoutInflater.from(context); 
if (inflater.getFactory() != null) { 
    inflater = inflater.cloneInContext(context); 
} 
inflater.setFactory(factory); 
6

バージョン以降サポートライブラリでchangeがありました22.1.0。

あなたはgetLayoutInflater().setFactory()

をコールしようとした場合は

それとも単に使用非推奨の新しいAPIを使用する必要があり、IllegalStateExceptionが得られます旧バージョン

  • com.android.support:appcompat-v7:22.0.0
  • com.android.support:appcompat-v4:22.0.0
+0

cud you pls作業コードを共有しますか? – AndroidGuy

関連する問題