我曾试图改变选项菜单的背景颜色在我的Android应用程序。 我使用ActionBarSherlock库。 我曾尝试这个代码更改选项菜单的背景颜色
https://stackoverflow.com/a/8475357/584095
但是,我结束了一个异常“java.lang.illegalstateexception:一个工厂已经设置在这个layoutinflater”的行
LayoutInflater.setFactory();
我不知道什么是错在此代码。 谁能帮我解决这个问题呢?
我曾试图改变选项菜单的背景颜色在我的Android应用程序。 我使用ActionBarSherlock库。 我曾尝试这个代码更改选项菜单的背景颜色
https://stackoverflow.com/a/8475357/584095
但是,我结束了一个异常“java.lang.illegalstateexception:一个工厂已经设置在这个layoutinflater”的行
LayoutInflater.setFactory();
我不知道什么是错在此代码。 谁能帮我解决这个问题呢?
这里是一个变化 ,因为22.1.0版本中支持库。
如果您尝试调用你会得到一个IllegalStateException getLayoutInflater().setFactory()
您应该使用新的API
ActionBarActivity
或者干脆用老版本
com.android.support:appcompat-v7:22.0.0
com.android.support:appcompat-v4:22.0.0
为了保持兼容性库的工作,避免“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) {
// ...
}
这是因为使用的是兼容库。 它设置自己的工厂来处理特定平台的布局。 您可以尝试打电话super.onCreate之前设置自己的工厂在onCreate()方法()。 这将不允许兼容库覆盖工厂,你将无法从XML文件膨胀片段,但造型应该工作。
这对我的作品:
LayoutInflater inflater = LayoutInflater.from(context);
if (inflater.getFactory() != null) {
inflater = inflater.cloneInContext(context);
}
inflater.setFactory(factory);
我面临着同样的问题,但没有答案帮助了我。
在我的情况:
我伸出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);
}
...
}