9

我试图在我的 android 应用程序中更改选项菜单的背景颜色。我正在使用 ActionBarSherlock 库。我已经尝试使用此代码更改选项菜单的背景颜色

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

但我最终得到了一个例外“java.lang.illegalstateexception:一个工厂已经在这个layoutinflater上设置”在行

LayoutInflater.setFactory();

我不知道这段代码有什么问题。谁能帮我解决这个问题?

4

5 回答 5

6

自版本 22.1.0 以来,支持库发生了变化

如果您尝试调用,您将收到 IllegalStateExceptiongetLayoutInflater().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:已在此 layoutinflater 上设置工厂”,您需要获取对已设置工厂的最终引用并在您自己的 Factory.onCreateView 中调用其 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) {
    // ...
}
于 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 回答
0

我遇到了同样的问题,但没有答案帮助我。

就我而言:

  • 我正在扩展 AppCompatActivity

  • 项目定位 API 27

  • 实现支持 lib 27.1.1

解决方案:显然,现在不需要将Factory设置为LayoutInflater,它会崩溃或被忽略。只需覆盖 AppCompatActivity 中的两个方法 onCreateView(...) (来自 android.support.v4.app.BaseFragmentActivityApi14)

public class myActivity extends AppCompatActivity  {
    ...
    @Override
    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
        if (name.compareTo("EditText") == 0) {
            CustomEdit newEdit = new CustomEdit(this,attrs); 
            return newEdit;
        }
        return super.onCreateView(parent, name, context, attrs);
    }
    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        return onCreateView(null, name, context, attrs);
    }
    ...
}
于 2018-06-01T11:18:33.357 回答