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:
- Appcompat-v7: 21.0.0 no funciona con el servicio de Google Play 6.1+
- Appcompat_v7: Error al recuperar el padre del elemento: No se encontró ningún recurso que coincida con el nombre dado
- Barra de herramientas de Android flecha posterior con icono como WhatsApp
- Uso de la barra de acción de soporte de inicio activada
- Cómo animar Burger to Arrow con Appcompat v7 21, Toolbar y DrawerLayout
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?
- Android: Capaz de hacer clic a través del cajón de nav? AppCompat v7: r21
- Barra de herramientas y TabLayout no son visibles en dispositivos Android 4.4
- Viendo el mensaje en los registros: "app: theme is deprecated"?
- CardView inserta la línea oscura en la parte inferior
- Los elementos de ActionBar aparecen siempre en el menú de desbordamiento
- No se puede resolver el símbolo AppCompatActivity - ¿No se reconocen las bibliotecas de soporte v7?
- El texto de todos mis brindis se muestra fuera del centro
- "Campo se puede convertir a una variable local" aparece al configurar el color de la barra de acción
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?
- Deshabilitar el desplazamiento entre las pestañas
- ¿Por qué se llama a onCreateView, onCreate, onActivityCreated del fragmento