android android-fragments tabs android-lifecycle fragment-tab-host

android - IllegalStateException: Fragmento ya agregado en el fragmento tabhost



android-fragments tabs (10)

FATAL EXCEPTION: main Process: com.example.loan, PID: 24169 java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form} at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192) at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722) at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533) at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5068) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) at dalvik.system.NativeStart.main(Native Method)

Entonces, tengo una aplicación de Android que se construye con el tabhost. Hay tres pestañas en total, en la pestaña2, hay un botón para hacer la transacción del fragmento en la pestaña2 (que llama a la función en la actividad del fragmento)

FragmentTransaction t = getSupportFragmentManager().beginTransaction(); t.replace(R.id.realtabcontent, mFrag); t.addToBackStack(null); t.commit();

Hay una excepción si corro así:

  1. Dentro de la pestaña2, presiono el botón para cambiar el fragmento
  2. Vaya a otra pestaña (por ejemplo, pestaña 1 o pestaña 3)
  3. Presione el botón de retroceso
  4. Lanzar excepción

¿Cómo arreglar eso? Gracias por ayudar


A veces sucede por no encontrar la identificación adecuada del diseño respectivo. Me enfrenté a este problema. Luego, después de muchas horas, descubrí que configuré la identificación incorrecta de la vista de reciclaje. Lo cambio y funciona bien para mí.

Por lo tanto, verifique el diseño de su fragmento.


Añadir fragmento como a continuación

FragmentTransaction t = getSupportFragmentManager().beginTransaction(); t.replace(R.id.realtabcontent, mFrag); t.addToBackStack(null); t.commitNowAllowingStateLoss();


Elimine el fragmento antiguo en caso de que aún se agregue y luego agregue el nuevo fragmento:

FragmentManager fm = getSupportFragmentManager(); Fragment oldFragment = fm.findFragmentByTag("fragment_tag"); if (oldFragment != null) { fm.beginTransaction().remove(oldFragment).commit(); } MyFragment newFragment = new MyFragment(); fm.beginTransaction().add(newFragment , "fragment_tag");


Esto sucede cuando intentamos agregar el mismo fragmento o DialogFragment dos veces antes de descartar,

solo llama

if(mFragment.isAdded()) { return; //or return false/true, based on where you are calling from }

Dicho esto, no veo ninguna razón por la cual eliminar el fragmento antiguo y agregar el mismo fragmento nuevamente, ya que podemos actualizar la IU / datos simplemente pasando parámetros al método dentro del fragmento


Incluso puede ocurrir si en FragmentStatePagerAdapter de su ViewPager crea un elemento que ya existe:

override fun getItem(position: Int): Fragment { return tabs[0] // Right variant: tabs[position] }

( private val tabs: List<Fragment> es una lista de fragmentos en pestañas).


Para mí funciona así:

Fragment oldFragment = manager.findFragmentByTag(READER_VIEW_POPUP); if (oldFragment != null) { manager.beginTransaction().remove(oldFragment).commit(); } FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commit();


Para mi sorpresa, cometí un estúpido error al llamar dos veces a la transacción del fragmento:

if (!FirebaseManager.isClientA && !FirebaseManager.isClientB) { fragment = new FragmentA(); getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit(); } else if (FirebaseManager.isClientB) { fragment = new FragmentB(); } else { fragment = new FragmentC(); } getFragmentManager().beginTransaction().add(R.id.fragment_frame, fragment, null).addToBackStack("").commit();

Asegúrate de no cometer el mismo error.


Puedes probar esto:

if (dialogFolderGallery.isAdded()) { dialogFolderGallery.dismiss(); } else { //bla...bla.. }


Solo tiene que marcar una condición antes de comenzar la transacción fragmentada

if (!fragmentOne.isAdded()){ transaction = manager.beginTransaction(); transaction.add(R.id.group,fragmentOne,"Fragment_One"); transaction.commit(); }

esto está funcionando perfectamente para mí ...


Solo tiene que marcar una condición en su fragmento mencionado a continuación:

if(!isAdded()) { return; }

isAdded = Devuelve verdadero si el fragmento se agrega actualmente a su actividad. Tomado del documento oficial. Esto no agregará ese fragmento si ya está agregado

Consulte el siguiente enlace para obtener una referencia:
http://developer.android.com/reference/android/app/Fragment.html#isAdded()