FragmentManager popBackStack n'enlève pas le fragment
Je suis la mise en œuvre de la navigation dans le menu à l'aide de Fragments. J'ai donc commencer avec la Maison, et alors les utilisateurs peuvent naviguer vers les différentes sections et les détails de chaque section.
Lorsqu'un utilisateur change de section, puis j'appelle la pop sur le fragmentmanager backstack jusqu'à ce que je la Maison, puis de charger la nouvelle section.
C'est tout fonctionne comme prévu. Mais je reçois ce problème:
- charge d'une section des appels setHasOptionsMenu(true) sur onResume()
- charge un autre article (ancien article il est suposed pour sortir de la pile). Je le vois sur OK. Aucun menu n'est affiché
- quitter l'application (par exemple, aller à Android Laucher de l'activité) et puis quand je rentre, je vois la bonne section, mais elle montre le Menu de l'ancien Fragment.
J'ai réitéré la backstack et imprimés chaque fragment, et ce n'est pas le fragment avec le menu.
J'ai mis une version de débogage de marque sur le onResume (), méthode (où le setHasOptionsMenu(true)
est marqué) et en effet, il en saisit ici, de sorte que le Fragment, il est encore quelque part.
Je veux savoir si je suis en train de faire quelque chose de mal et comment pourrais-je le résoudre, merci
Mise à jour:
Je suis en utilisant ce code pour charger de nouveaux fragments
fm.beginTransaction()
.add(container, sectionFragment.getFragment())
.addToBackStack(sectionFragment.getFragmentName())
.commit();
Et pour les supprimer:
private void clearStack(){
int count = fm.getBackStackEntryCount();
while(count > 1){
fm.popBackStack();
count--;
}
}
NOTE 1: je suis en utilisant ajouter au lieu de les remplacer parce que je ne veux pas perdre mon état de fragment, quand je revenir en arrière à partir de la section détail. Lorsque je charge un autre article, puis-je appeler clearStack à la pop de la pile jusqu'à 1, puis charge le nouveau fragment. À la fin, je vais appeler executePendingTransactions() pour terminer de retirer les fragments provenant de la transaction.
NOTE 2: je vois que c'est entrer sur mon fragment onDestroy() la méthode, de sorte qu'il est suposed à être détruit. Mais je ne sais pas pourquoi il est appelé de nouveau lorsque la reprise de l'activité.
Utilisez-vous FragmentTransaction.ajouter ou FragmentTransaction.remplacer ?
OriginalL'auteur edrian | 2014-05-06
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé que le problème n'était pas dans la logique de l'ajout et la suppression fragment de la pile.
Le problème est que certains de le fragment chargé une autre les fragments à l'intérieur de celui-ci (il avait ViewPager composant). Ensuite j'ai pensé que lorsque le fragment a été enlevé puis, ces fragments ont été supprimés.
Ceci est vrai UNIQUEMENT si vous utilisez
getChildFragmentManager()
méthode. Cette méthode DOIT être utilisée lors du chargement des fragments à l'intérieur d'autres fragmets. Si non, alors les fragments sont associés avec les fragments de l'activité.OriginalL'auteur edrian
J'ai trouvé cette question, parce que, après l'appel de
ce code
fragmentManager.getFragments().size()
retourne le nombre maximum de fragments de moi, qui étaient dans la pile. J'ai vérifié chaque fragment sur null. Et j'ai constaté que certains fragment est nul sur mon cas. Peut-être cela aidera à quelqu'un)OriginalL'auteur Malder
popBackStack
aurez juste revenir à vos dernièresFragmentTransaction
.Si vous utilisez
FragmentTransaction.add
,popBackStack
vais juste appelerFragmentTransacetion.remove
.Mais si vous appelez
FragmentTransaction.replace
,popBackStack
appelleraFragmentTransaction.remove
etFragmentTransaction.add
Pour votre "NOTE 1" :
FragmentTransaction.replace
ne changera pas votre fragment de l'état.OriginalL'auteur Neige
Si vous êtes vraiment à la recherche pour enlever les fragments à la fois, puis suivre:
Comment remplacer des Fragments de différents types?
Utiliser autrement remplacer transaction pour les fragments lisse transitiona et hassel gratuit approche, voir https://stackoverflow.com/a/23013075/3176433
Également comprendre Fragment du cycle de vie,
http://developer.android.com/guide/components/fragments.html
OriginalL'auteur zIronManBox
J'ai eu un problème similaire où le
popBackStack()
de ne pas supprimer mon fragment.Cependant, j'ai remarqué que j'ai appelé le mauvais
FragmentManager
, où j'ai dû appelergetSupportFragmentMananger()
au lieu degetFragmentManager()
.OriginalL'auteur Aviv Cohen