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".

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) 

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()

  • Parse para Android no puede pin Lista de subclase a caché
  • Crear una vista compuesta en Android
  • NullPointerException al llamar a getSupportActionBar () desde dentro de Fragment (ActionBarCompat)
  • ¿Cómo saber si una coordenada X e Y están dentro de mi botón?
  • Android-library con la dependencia específica de Flavors de Producto
  • Obtención de la versión del dispositivo os en Android mediante programación
  • ¿Cómo generar la misma clave AES en Java (Android) como en .Net?
  • Conversión de httpclient 3 a httpclient 4 (política de cookies)
  • SwitchPreference onChecked / onClick Listener
  • OnBatchScanResults no se llama en Android BLE
  • Android java apoyo lambda expresión en java 8?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.