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í:
- Dentro de la pestaña2, presiono el botón para cambiar el fragmento
- Vaya a otra pestaña (por ejemplo, pestaña 1 o pestaña 3)
- Presione el botón de retroceso
- 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()