LayoutInflater de la actividad ya tiene instalado un Factory para que no podamos instalar AppCompat

Estoy usando la biblioteca AppCompat (com.android.support:appcompat-v7:22.1.0) en mi aplicación. Creé un ActionBar en un fragmento. Cuando hago clic en un elemento de menú, aparece un cuadro de diálogo de alerta. Aquí está mi código:

@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); } } 

Y mi método 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(); } 

Todo funciona bien, pero cuando hago clic en el elemento de menú, el logcat me muestra un error:

I / AppCompatDelegate: LayoutInflater de la actividad ya tiene una fábrica instalada por lo que no podemos instalar AppCompat

¿Cómo resolver esto?

Se requiere que utilice el contexto temático en este caso, es decir, en lugar de

Nuevo AlertDialog.Builder (getActivity ());

tu tienes que hacer

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

Además, también necesitas seguir el tema padre y el consejo windowActionBar dado aquí – support.v7.app.AlertDialog lanza NullPointerException on dismiss

Por lo que puedo decir, appcompat 23.1.1 llama a installViewFactory() en AppCompatDelegateImplV7 cada vez que muestre un diálogo creado por AlertDialog.Builder .

Pila de llamadas:

En android.support.v7.app.AppCompatDelegateImplV7.installViewFactory (AppCompatDelegateImplV7.java:970) en android.support.v7.app.AppCompatDialog.onCreate (AppCompatDialog.java:58) en android.support.v7.app.AlertDialog.onCreate (AlertDialog.java:239) en android.app.Dialog.dispatchOnCreate (Dialog.java:361) en android.app.Dialog.show (Dialog.java:262) en android.support.v7.app.AlertDialog $ Builder. Show (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"); } } 

Como puede ver, una vez que la fábrica ya está configurada, sólo registra el mensaje informativo. Parece bastante seguro para ignorar, pero puede ser molesto cuando llena sus registros.

Solución – El error "LayoutInflater de la actividad ya tiene una fábrica instalada por lo que no podemos instalar AppCompat" también podría ser debido a un código incorrecto. En mi caso el código llamaba "super.onCreate (savedInstanceState)" dos veces (error de código) y una vez que la llamada duplicada fue eliminada el error fue resuelto.

Este es mi registro de errores:

 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 

Cambio

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

a

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

En caso de inflar un diálogo, no queremos que se agregue al ViewGroup especificado (== null).

Esto podría ayudar.

Segundo intento

El info-log es lanzado por el código siguiente en 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"); } } 

¿Podría ser que usted instaló un Factory algunoswere antes en su código?

  • Deshacerse de la sombra de ActionBar sobre SlidingTabLayout
  • Barra de herramientas de AppCompat: Cambiar color de icono de desbordamiento en ActionMode
  • ActionBarActivity se cierra después de presionar el botón del menú de hardware. Sin seguimiento de pila
  • Estilo de acción de AppCompat
  • Crash: java.lang.NoClassDefFoundError: android.support.v7.appcompat.R $ layout
  • ¿Es posible tener un menú de barras de acción usando la librería appcompat?
  • ActionBarCompat muestra todas las acciones en el menú de desbordamiento
  • Teñido de MenuItem en la barra de herramientas de AppCompat
  • AppCompat v21 Barra de herramientas que cambia el tamaño del logotipo
  • El elemento de menú ActionBarCompat no se muestra
  • No contraer la barra de herramientas cuando RecyclerView se ajusta a la pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.