J'utilise la bibliothèque de compatibilité Android pour implémenter des fragments et j'ai étendu l'exemple de mise en page afin qu'un fragment contienne un bouton qui déclenche un autre fragment.
Dans le volet de sélection sur la gauche, j'ai 5 éléments sélectionnables - A B C D E
.
Chacun charge un fragment (via FragmentTransaction:replace
) dans le volet de détails -a b c d e
Maintenant, j'ai étendu le fragment e
pour contenir un bouton qui charge un autre fragment e1
également dans le volet de détails. J'ai fait ceci sur e
la méthode onClick de fragment comme suit:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Si je fais les sélections suivantes:
E - e - e1 - D - E
Ensuite, le fragment e
est dans le volet de détails. C'est bien et ce que je veux. Cependant, si j'appuie sur le back
bouton à ce stade, cela ne fait rien. Je dois cliquer dessus deux fois car il e1
est toujours sur la pile. De plus, après avoir cliqué, j'ai obtenu une exception de pointeur nul dans onCreateView:
Pour `` résoudre '' ce problème, j'ai ajouté ce qui suit chaque fois que A B C D E
est sélectionné:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
Vous vous demandez simplement si c'est la bonne solution ou si je devrais faire quelque chose de différent?
L'autre solution propre si vous ne voulez pas afficher toutes les entrées de la pile ...
Cela nettoiera d'abord la pile, puis chargera un nouveau fragment, donc à tout moment, vous n'aurez qu'un seul fragment dans la pile
la source
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
avant un remplacement () car chargent l'appel FragmentonCreateView()
,onActivityCreated()
etc. Restauration et Destroing un fragment est instantanément mauvais. Le Fragment peut enregistrer un récepteur par exemple. Cela affecte les performances.FragmentTransaction
? Y a-t-il seulement de mauvaises performances d'une mauvaise pile de fragments?Grâce à la réponse de Joachim , j'utilise le code pour effacer enfin toutes les entrées de la pile arrière.
la source
popBackStack(backStackId, INCLUSIVE)
fera remonter tous les fragments (états) à backStackId, donc une fois que vous aurez pop le plus basi
que vous allez pop, tous les plus élevés devraient être sautés en même temps. Alors, à quoi sert une boucle?J'ai beaucoup recherché pour nettoyer Backstack, et enfin voir Transaction BackStack et sa gestion . Voici la solution qui a le mieux fonctionné pour moi.
La méthode ci-dessus boucle sur toutes les transactions de la backstack et les supprime immédiatement une à la fois.
Remarque: le code ci - dessus ne fonctionne parfois pas et je suis confronté à l' ANR à cause de ce code, alors veuillez ne pas essayer ceci.
La méthode de mise à jour ci-dessous supprime tout le fregment de ce "nom" de la backstack.
la source
J'utilise un code similaire à ceux qui utilisent la boucle while mais j'appelle le nombre d'entrées dans chaque boucle ... donc je suppose que c'est un peu plus lent
la source
Comme écrit dans Comment faire sortir un fragment de backstack et par LarsH ici, nous pouvons afficher plusieurs fragments de haut en bas à une balise spécifique ( avec le fragment étiqueté ) en utilisant cette méthode:
Remplacez "frag" par la balise de votre fragment. Rappelez-vous que nous devons d'abord ajouter le fragment à backstack avec:
Si nous ajoutons des fragments avec
addToBackStack(null)
, nous ne ferons pas apparaître les fragments de cette façon.la source
la source