web-dev-qa-db-fra.com

IllegalStateException: Fragment déjà ajouté dans le fragment tabhost

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:

  1. À l'intérieur de l'onglet 2, j'appuie sur le bouton pour changer de fragment
  2. Aller à un autre onglet (ex. Onglet 1 ou onglet 3)
  3. Appuyez sur le bouton de retour
  4. Lancer une exception

Comment résoudre ce problème? Merci pour ton aide

50
user782104

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

102
Ujju

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");
5
vovahost

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

5
Deep Mehta

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

4
Mehul Solanki

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. 

1
Mihab

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

0
CoolMind

Ajouter un fragment comme ci-dessous

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

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();
0
Farid Haq

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

0
Seto Elkahfi