该活动的LayoutInflater已经安装了一个工厂,所以我们不能安装AppCompat的

我在我的应用程序中使用AppCompat库(com.android.support:appcompat-v7:22.1.0)。 我在一个片段中创build了一个ActionBar。 当我点击一个菜单项时,会显示一个警报对话框。 这是我的代码:

@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.action_new: showFilterDialog(); return true; case R.id.action_send: new sendInventoryTask().execute(); return true; default: return super.onOptionsItemSelected(item); } } 

和我的showInventoryDialog方法:

 private void showFilterInventoryDialog() { AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); LayoutInflater inflater= getActivity().getLayoutInflater(); View v = inflater.inflate(R.layout.dialog_filter_inventory,null); alert.setView(v); alert.setTitle(getResources().getString(R.string.filters)); alert.setPositiveButton(getResources().getString(R.string.filter), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // TODO } }); alert.setNegativeButton(getResources().getString(R.string.cancel), null); alert.show(); } 

一切工作正常,但是当我点击菜单项,logcat显示我一个错误:

我/ AppCompatDelegate:该活动的LayoutInflater已经安装了一个工厂,所以我们不能安装AppCompat的

如何解决这个问题?

Solutions Collecting From Web of "该活动的LayoutInflater已经安装了一个工厂,所以我们不能安装AppCompat的"

在这种情况下,你需要使用主题上下文,而不是

新的AlertDialog.Builder(getActivity());

你必须做

 new AlertDialog.Builder(getSupportActionBar().getThemedContext()); 

此外,您还需要遵循父主题和windowActionBar提示在这里 – support.v7.app.AlertDialog抛出NullPointerExceptionclosures

从我所知道的情况来看,appcompat 23.1.1每次显示AlertDialog.Builder创build的对话框时都会在AppCompatDelegateImplV7调用installViewFactory()

调用堆栈:

在android.support.v7.app.App.pat.v7.app.App.CreateImplV7.installViewFactory(AppCompatDelegateImplV7.java:970)上的android.support.v7.app.AppCompatDialog.onCreate(AppCompatDialog.java:58)在android.support.v7.app.AlertDialog.onCreate (AlertDialog.java:239)at android.app.Dialog.dispatchOnCreate(Dialog.java:361)at android.app.Dialog.show(Dialog.java:262)at android.support.v7.app.AlertDialog $ Builder。秀(AlertDialog.java:902)

  @Override public void installViewFactory() { LayoutInflater layoutInflater = LayoutInflater.from(mContext); if (layoutInflater.getFactory() == null) { LayoutInflaterCompat.setFactory(layoutInflater, this); } else { Log.i(TAG, "The Activity's LayoutInflater already has a Factory installed" + " so we can not install AppCompat's"); } } 

正如你所看到的,一旦工厂已经设置,它只logging信息消息。 忽略它似乎是相当安全的,但是当它填满你的日志时,它会变得烦人。

解决scheme – 错误“活动的LayoutInflater已经安装了一个工厂,所以我们不能安装AppCompat”也可能是由于不正确的代码。 在我的情况下,代码调用“super.onCreate(savedInstanceState)”两次(代码错误),一旦重复调用被删除,错误已解决。

这是我的错误日志:

 02-29 04:54:40.706 4417-4417/com.projects.ajay.example2 I/AppCompatDelegate: The Activity's LayoutInflater already has a Factory installed so we can not install AppCompat's 02-29 04:54:40.709 4417-4417/? D/AndroidRuntime: Shutting down VM 02-29 04:54:40.715 4417-4417/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.projects.ajay.example2, PID: 4417 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.projects.ajay.example2/com.projects.ajay.example2.MainActivity}: java.lang.IllegalStateException: Already attached at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2393) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5351) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) Caused by: java.lang.IllegalStateException: Already attached at android.support.v4.app.FragmentManagerImpl.attachController(FragmentManager.java:2025) at android.support.v4.app.FragmentController.attachHost(FragmentController.java:95) at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:276) at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:61) at com.projects.ajay.example2.MainActivity.onCreate(MainActivity.java:24) at android.app.Activity.performCreate(Activity.java:6020) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2284) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2393) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5351) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) 02-29 04:54:40.727 4417-4417/? I/Process: Sending signal. PID: 4417 SIG: 9 

更改

 inflater.inflate(R.layout.dialog_filter_inventory,null); 

 inflater.inflate(R.layout.dialog_filter_inventory,null,false); 

在扩大对话框的情况下,我们不希望它附加到指定的ViewGroup(== null)。

这可能有帮助。

第二次尝试

信息日志由AppCompatDelegateImplV7的以下代码引发:

 @Override public void installViewFactory() { LayoutInflater layoutInflater = LayoutInflater.from(mContext); if (layoutInflater.getFactory() == null) { LayoutInflaterCompat.setFactory(layoutInflater, this); } else { Log.i(TAG, "The Activity's LayoutInflater already has a Factory installed" + " so we can not install AppCompat's"); } } 

难道你是在你的代码之前安装了一个工厂吗?