09-19 12:23:01.084: E/AndroidRuntime(24169): FATAL EXCEPTION: main
09-19 12:23:01.084: E/AndroidRuntime(24169): Process: com.example.loan, PID: 24169
09-19 12:23:01.084: E/AndroidRuntime(24169): Java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form}
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.Java:1192)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.Java:722)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.Java:1533)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.Java:489)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1484)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.Java:450)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.os.Handler.handleCallback(Handler.Java:733)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.os.Handler.dispatchMessage(Handler.Java:95)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.os.Looper.loop(Looper.Java:136)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Android.app.ActivityThread.main(ActivityThread.Java:5068)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Java.lang.reflect.Method.invokeNative(Native Method)
09-19 12:23:01.084: E/AndroidRuntime(24169): at Java.lang.reflect.Method.invoke(Method.Java:515)
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:792)
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:608)
09-19 12:23:01.084: E/AndroidRuntime(24169): at dalvik.system.NativeStart.main(Native Method)
Donc, j'ai une application Android qui construit avec le tabhost. Il y a trois onglets au total, dans l'onglet2, il y a un bouton pour effectuer la transaction de fragment dans l'onglet2 (qui appelle la fonction dans l'activité de fragment).
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.realtabcontent, mFrag);
t.addToBackStack(null);
t.commit();
Il y a une exception si je cours comme ça:
Comment résoudre ce problème? Merci pour ton aide
Cela se produit lorsque nous essayons d’ajouter deux fois le même fragment ou le même DialogFragment avant de le rejeter.
il suffit d'appeler
if(mFragment.isAdded())
{
return; //or return false/true, based on where you are calling from
}
Cela dit, je ne vois aucune raison pour supprimer l'ancien fragment et rajouter le même fragment car nous pouvons mettre à jour l'interface utilisateur/les données en transmettant simplement les paramètres à la méthode dans le fragment
Supprimez l'ancien fragment s'il est encore ajouté, puis ajoutez le nouveau fragment:
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");
Il vous suffit de vérifier une condition de votre fragment mentionnée ci-dessous:
if(!isAdded())
{
return;
}
isAdded = Renvoie true si le fragment est actuellement ajouté à son activité. Tiré du document officiel . Cela n'ajoutera pas ce fragment s'il est déjà ajouté
Vérifiez le lien ci-dessous pour une référence:
http://developer.Android.com/reference/Android/app/Fragment.html#isAdded ()
Il vous suffit de vérifier une condition avant de commencer la transaction de fragment
if (!fragmentOne.isAdded()){
transaction = manager.beginTransaction();
transaction.add(R.id.group,fragmentOne,"Fragment_One");
transaction.commit();
}
cela fonctionne parfaitement pour moi ...
Parfois, cela arrive pour ne pas trouver l'identifiant approprié dans la disposition respective. J'ai fait face à ce problème. Puis, après de nombreuses heures, j’ai constaté que je définissais un mauvais identifiant recyclerview. Je le change et fonctionne bien pour moi.
Alors, vérifiez votre disposition de fragment.
Cela peut même se produire si dans FragmentStatePagerAdapter
de votre ViewPager
vous créez un élément qui existe déjà
override fun getItem(position: Int): Fragment {
return tabs[0] // Right variant: tabs[position]
}
(private val tabs: List<Fragment>
est une liste de fragments dans des onglets).
Ajouter un fragment comme ci-dessous
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.realtabcontent, mFrag);
t.addToBackStack(null);
t.commitNowAllowingStateLoss();
Pour moi cela fonctionne comme:
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();
À ma grande surprise, j'ai commis une erreur stupide en appelant deux fois la transaction de fragment:
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();
Assurez-vous de ne pas commettre la même erreur.