1

メニュー オプションの背景色を変更したい。そして、私はエラーが発生します:
FATAL EXCEPTION: main java.lang.IllegalStateException: A factory has already been set on this LayoutInflater at android.view.LayoutInflater.setFactory(LayoutInflater.java:277)

私はこのコードを使用します:
private void setMenuBackground() {

 getLayoutInflater().setFactory(new Factory() { 
        @Override 
        public View onCreateView (String name, Context context, AttributeSet attrs) { 
            if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) { 
            try { 

                    LayoutInflater f = getLayoutInflater(); 
                    final View view = f.createView(name, null, attrs); 

                    new Handler().post( new Runnable() { 
                        public void run () { 
                            view.setBackgroundColor(Color.GRAY); 
                        } 
                    }); 
                    return view; 
                } 
                catch (InflateException e) { 
                } 
                catch (ClassNotFoundException e) { 
                } 
            } 
            return null; 
        } 
    }); 

}

いくつかの答えを見つけましたが、役に立ちません。
この問題を解決するにはどうすればよいですか? ありがとう。

4

2 に答える 2

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-04T06:00:56.893 に答える
-1

あなたが試すことができます

LayoutInfalter inflater = getLayoutInflater.cloneInContext(this);

次に、複製したレイアウトで必要なことを行います

しかし、あなたの onCreateView がそのように実行されるかどうかはわかりません

于 2012-10-12T10:34:49.490 に答える