Java.lang.IllegalStateException: Fragmento ya agregado
Tengo un problema con una aplicación de Android compilada y en ejecución con SDK objetivo 4.3. La aplicación tiene dos actividades, una MainActivity que también es la Actividad de Lanzador y una SecondActivity. Ambos están utilizando Fragmentos. Para admitir dispositivos más antiguos también se utiliza la lib de soporte.
En el escenario siguiente llega al error "IllegalStateException: Fragment already added".
- ¿Cuándo / por qué se destruye mi instancia de singleton de Java?
- Error de compilación de Gradle: No se pueden cargar metadatos de Maven desde https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml
- Ejemplo androide del presentador de la versión / ejemplos del regulador
- Android weakReference to Activity se anula mientras se está ejecutando la actividad
- Android consigue el intento al implementar RecognitionListener
1) Iniciar la aplicación -> MainActivity se muestra
2) cambiar a SecondActivity con una intención
3) Pulse el botón Inicio
4) Esperar más tiempo (probado con 24 horas)
5) pulse de nuevo el icono de la aplicación -> Excepción. Si el tiempo es más corto, SecondActivity se muestra como se esperaba.
He leído una gran cantidad de IllegalStateExceptions durante la manipulación de fragmentos, pero todos ellos señalaron un problema con un método replace (). En el Stacktrace, mi propio código nunca se llama.
El Fragmento se agrega en el método de Activies onCreate ():
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(..); ListFragment listFragment = this.getCaptureListFragment(); FragmentTransaction tx = this.getSupportFragmentManager().beginTransaction(); tx.add(R.id.MainFragmentContainer, listFragment, "list_fragment_tag"); tx.commit(); } private ListFragment getListFragment() { ListFragment listFragment = (ListFragment) this.getSupportFragmentManager().findFragmentByTag("list_fragment_tag"); if (listFragment == null) { listFragment = new ListFragment(); } return listFragment; } java.lang.RuntimeException: Unable to start activity ComponentInfo{de.myexample.demo/de.myexample.demo.ui.SecondActivity}: java.lang.IllegalStateException: Fragment already added: ListFragment{42283f58 #0 id=0x7f060094 de.myexample.demo.ui.ListFragment} at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) at android.app.ActivityThread.access$600(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalStateException: Fragment already added: ListFragment{42283f58 #0 id=0x7f060094 de.myexample.demo.ui.ListFragment} at android.support.v4.app.FragmentManagerImpl.addFragment(SourceFile:1175) at android.support.v4.app.BackStackRecord.run(SourceFile:616) at android.support.v4.app.FragmentManagerImpl.execPendingActions(SourceFile:1460) at android.support.v4.app.FragmentActivity.onStart(SourceFile:556) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171) at android.app.Activity.performStart(Activity.java:5143) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) ... 11 more java.lang.IllegalStateException: Fragment already added: ListFragment{42283f58 #0 id=0x7f060094 de.myexample.demo.ui.ListFragment} at android.support.v4.app.FragmentManagerImpl.addFragment(SourceFile:1175) at android.support.v4.app.BackStackRecord.run(SourceFile:616) at android.support.v4.app.FragmentManagerImpl.execPendingActions(SourceFile:1460) at android.support.v4.app.FragmentActivity.onStart(SourceFile:556) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171) at android.app.Activity.performStart(Activity.java:5143) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) at android.app.ActivityThread.access$600(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method)
- Biblioteca FFT en android Sdk
- Cómo cambiar el tamaño de la imagen gif en android
- GcmListenerService.onMessageReceived () no se ha llamado
- El estado de la batería no se está cargando
- ¿Vive la variable estática incluso después de que la aplicación se cierre?
- Los caracteres de cuenta con TextWatcher fallan en HTC longpress
- Generar jar minimizado con sólo las clases usadas
- Android - Syncano SDK no funciona
De acuerdo, resuelto por mi cuenta.
Puse todos los fragmentos en onPause () y almacenar el estado en algunos booleanos. Dependiendo de que los booleanos los fragmentos se ponen en onResume (). Que el lanzamiento es estable independientemente de cuánto tiempo la actividad estaba en el fondo.
boolean addList = false; @Override protected void onResume() { FragmentTransaction tx = this.getSupportFragmentManager().beginTransaction(); if (this.addList) { ListFragment list = this.getListFragment(); tx.add(R.id.MainFragmentContainer, list, "list_fragment_tag"); } tx.commit(); super.onResume(); this.addList = false; } @Override protected void onPause() { this.addList = this.getListFragment().isAdded(); ... if (this.addList) { FragmentTransaction tx = this.getSupportFragmentManager().beginTransaction(); tx.remove(this.getListFragment()); tx.commit(); } this.getSupportFragmentManager().executePendingTransactions(); super.onPause(); }
Tal vez eso ayude a alguien con el mismo problema
Para reproducir esto, uno podría activar "No mantener actividades" en Configuración -> Opciones de desarrollador. Luego haga una pausa y reanude la actividad.
Eso es lo que no tiene que esperar 24 horas 🙂
El gestor de fragmentos guarda su estado al salir. Así que no tienes que añadir tu fragmento de nuevo.
Hazlo así:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(..); if (savedInstanceState == null) { ListFragment listFragment = this.getCaptureListFragment(); FragmentTransaction tx = this.getSupportFragmentManager().beginTransaction(); tx.add(R.id.MainFragmentContainer, listFragment, "list_fragment_tag"); tx.commit(); } }
No es necesario crear un nuevo campo booleano para comprobar el estado de adición del fragmento. Hay también un método en el fragmento. Sólo myFragment.isAdded()
que usarlo: myFragment.isAdded()
- DexIndexOverflowException sólo al ejecutar pruebas
- Evento de clic de JQuery de un elemento div en li no disparado en Safari móvil