Fragment déjà ajouté l'exception IllegalStateException
J'utilise cette méthode sur mon Activité conteneur pour afficher une BFrag
public void showBFrag()
{
//Start a new FragmentTransaction
FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction();
if(mBFrag.isAdded())
{
Log.d(LOG_TAG, "Show() BFrag");
fragmentTransaction.show(mBFrag);
}
else
{
Log.d(LOG_TAG, "Replacing AFrag -> BFrag");
fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag);
}
//Keep the transaction in the back stack so it will be reversed when backbutton is pressed
fragmentTransaction.addToBackStack(null);
//Commit transaction
fragmentTransaction.commit();
}
Je l'appelle de mes Activités de manutention de conteneurs; pour la première fois:
- rentre dans le else et mBFrag remplacer mAFrag.
Alors j'ai appuyer sur le bouton de retour:
- et le fonctionnement est inversé (mAFrag est montré, mais.. est-ce que mBFrag est supprimé?).
Puis-je aller de l'avant à nouveau en appelant showBFrag() de la même Activité:
- et il obtient de NOUVEAU dans le else. (donc je peux en déduire que mBFrag n'est PAS AJOUTÉ)
- mais j'ai eu un Fragment déjà ajouté l'exception IllegalStateException... (alors pourquoi il n'a pas entrer dans l'instruction si à la place?)
Donc:
- Pourquoi le isAdded() la méthode ne retourne pas VRAI que si je suis un Fragment déjà ajouté l'exception IllegalStateException??
- Ne popBackStack opération de supprimer complètement précédemment ajouté des fragments?
- Ce comportement je suis malentendu?
EDIT:
Ici est l'info de l'exception.
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): java.lang.IllegalStateException: Fragment already added: BFrag{40b28158 id=0x7f0c0085}
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at android.app.BackStackRecord.doAddOp(BackStackRecord.java:322)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at android.app.BackStackRecord.replace(BackStackRecord.java:360)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at android.app.BackStackRecord.replace(BackStackRecord.java:352)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at myPackageName.containerActivity.showBFrag() //This line: "fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag);"
- Est votre fragment d'un singleton?
- twitter.com/cstruter/status/900982307812724736
Vous devez vous connecter pour publier un commentaire.
Enfin ma solution a été d'exécuter remove() du fragment précédent et ajouter() le nouveau. Même si c'est ce que méthode replace() était censé faire...
Mais j'ai encore de deviner pourquoi la méthode replace() n'a pas fonctionné dans ce cas... c'est vraiment bizarre et je veux jeter que c'est parce que je suis un malentendu quelque chose ou fait quelque chose de mal.
replace(...)
avec l'ancien sans problèmes (avec mon tout premier fragment ajouté avecadd(...)
.BackStackRecord:popFromBackStack
où sur une OP_REPLACE " l'activité est affectée à une variable dans le fragment qui a été supprimé et pas dans celui qui est en train d'être ajouté. Je vais poser un rapport de bug, à moins que quelqu'un d'autre a le désir de le faire. N'a besoin de quelqu'un pour clarifier leur réponse avec le fait que c'est un contournement d'un bug et pas nécessairement un problème avec s'accrocher à la référence? Cheers les gars.Si l'état de l'activité a déjà été enregistré son plus sûr d'appeler commettre. Vous devez appeler
commitAllowingStateLoss()
à la place. Espérons que cette aide!Edit: ok j'ai pris un peu plus près à votre question, le problème est que vous tentez d'ajouter un fragment qui a déjà été ajouté. Même si vous utilisez de remplacer ou de retirer les appels que vous ne pouvez pas le faire. Seulement contourner que j'ai trouvé est de créer une nouvelle instance d'un fragment et de l'ajouter à chaque fois. Une fois que vous retirez ou remplacez un fragment, il est préférable de déposer l'ensemble de vos références afin que le GC peut prendre soin d'elle.
commit
.Probablement pas lié à cette question directement, mais j'ai aussi remarqué que la fixation d'une transition vers la FragmentTransaction va provoquer une IllegalStateException, tout en ne fixant pas de transition ne sera pas.
Voici le bug de ce numéro: http://code.google.com/p/android/issues/detail?id=25598
Vérifier si le frament est déjà ajouté ou non à l'aide de la méthode de fragment.isAdded() Faire remplacer ou ajouter le fragment en conséquence
essayer après fragmentTransection.replace()
J'ai utilisé ceci:
et a ajouté fragment avec
MyFragment.class.getName()
signifietag
J'ai essayé d'appeler
FragmentTransaction.remove()
deonTabUnselected()
et il a travaillé autour de ce bug.Ce code fonctionne très bien pour moi. essayez cette
Résolu par une boucle dans mes fragments et de vérifier si isAdded() est vrai, alors de supprimer ce fragment. Plus de détails ici.
Retrait
setOffscreenPageLimit
deViewpager
résolu mon problème.Merci.
si(mFragment.isAdded())
{
return; //ou return false/true, sur la base d'où vous appelez de l'
}