java.lang.illegalstateexception:一个工厂已经设置这个layoutin

2019-07-03 20:57发布

我曾试图改变选项菜单的背景颜色在我的Android应用程序。 我使用ActionBarSherlock库。 我曾尝试这个代码更改选项菜单的背景颜色

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

但是,我结束了一个异常“java.lang.illegalstateexception:一个工厂已经设置在这个layoutinflater”的行

LayoutInflater.setFactory();

我不知道什么是错在此代码。 谁能帮我解决这个问题呢?

Answer 1:

这里是一个变化 ,因为22.1.0版本中支持库。

如果您尝试调用你会得到一个IllegalStateException getLayoutInflater().setFactory()

您应该使用新的API

  • LayoutInflaterCompat.setFactory()
  • AppCompatActivity代替已过时ActionBarActivity

或者干脆用老版本

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


Answer 2:

为了保持兼容性库的工作,避免“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) {
    // ...
}


Answer 3:

这是因为使用的是兼容库。 它设置自己的工厂来处理特定平台的布局。 您可以尝试打电话super.onCreate之前设置自己的工厂在onCreate()方法()。 这将不允许兼容库覆盖工厂,你将无法从XML文件膨胀片段,但造型应该工作。



Answer 4:

这对我的作品:

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


Answer 5:

我面临着同样的问题,但没有答案帮助了我。

在我的情况:

  • 我伸出AppCompatActivity

  • 项目定位API 27

  • 实施支持LIB 27.1.1

解决方案:显然,现在也没有必要设置出厂到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);
    }
    ...
}


文章来源: java.lang.illegalstateexception: a factory has already been set on this layoutinflater