130 votes

Est-ce la bonne façon de pile de retour de Fragment nettoyage lorsque vous quittez une pile profondément imbriquée ?

Je suis en utilisant l'Android Compatbility bibliothèque à mettre en œuvre fragements et ont étendu la mise en page de l'échantillon, de sorte qu'un fragment contient un bouton qui déclenche un autre fragment.

Ainsi, dans le volet de sélection, sur la gauche, j'ai 5 éléments sélectionnables - A B C D E

Chaque charge d'un fragment (via FragmentTransaction:remplacer) dans le volet de détails - a b c d e

Maintenant, je l'ai étendu fragement 'e' pour contenir un bouton qui charge un autre fragment " e1 " également dans le volet de détails. Je l'ai fait sur ce fragment de la "e"s onClick méthode 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

Alors fragment de " e " dans le volet de détails. Ce qui est bien et ce que je veux. Cependant, si j'ai frappé le bouton "retour" à ce stade, il ne fait rien. Je dois cliquer deux fois parce que " e1 " est encore sur la pile. En outre, après avoir cliqué autour de moi, je suis une exception de pointeur null 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();
}

Je me demandais si c'est la bonne solution ou si je dois faire quelque chose de différent?

Merci à l'avance. Peter

254voto

Joachim Points 936

Eh bien, il ya quelques façons d'aller sur ce en fonction du comportement prévu, mais ce lien devrait vous donner toutes les meilleures solutions et il n'est pas surprenant est de Dianne Hackborn

http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42

Essentiellement, vous avez les options suivantes

  • Utilisez un nom pour votre initiale de la pile de retour de l'état et de l'utilisation FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE).
  • Utiliser FragmentManager.getBackStackEntryCount()/getBackStackEntryAt().getId() pour récupérer l'ID de la première entrée sur la pile de retour, et FragmentManager.popBackStack(int id, FragmentManager.POP_BACK_STACK_INCLUSIVE).
  • FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) est censé pop de l'ensemble de la pile de retour... je pense que la documentation pour c'est tout simplement faux. (En fait, je suppose qu'il n'a tout simplement pas de couvrir le cas où vous passez en POP_BACK_STACK_INCLUSIVE),

61voto

Pawan M Points 4396

L’autre solution propre si vous ne voulez pas faire éclater toutes les entrées de pile...

Cela va nettoyer la pile tout d’abord et puis charger un nouveau fragment, à un moment donné, vous aurez seulement seul fragment dans la pile

28voto

Jay Parker Points 267

Merci Joachim réponse, j’ai utiliser le code pour effacer toutes les entrées de la pile de retour enfin.

-4voto

farid_z Points 375
    // pop back stack all the way
    final FragmentManager fm = getSherlockActivity().getSupportFragmentManager();
    int entryCount = fm.getBackStackEntryCount(); 
    while (entryCount-- > 0) {
        fm.popBackStack();
    }

-6voto

stack_ved Points 436

Je sais que je réponds à la fin. Mais j'ai réalisé, tout FragmentTransaction.pop() les méthodes sont mal conçus constructions! Pour un, ils sont en train de faire quelque chose qui à n'importe quel développeur ne devrait pas s'attendre à faire et je suis assez sûr qu'il y a de meilleures façons de gérer les fragments de la pile de retour.

Pop ne pas afficher l'écran comme on pouvait s'y attendre, mais il fait plus, il annule la transaction qui est si dangereux et effrayant.

Je suggère d'éviter l'utilisation de pop() les méthodes, mais plutôt de les remplacer ou même mieux de supprimer et d'ajouter lorsque vous traitez avec des fragments de!

Et sur le nettoyage des fragment de la pile de retour, vous ne voulez jamais si vous n'avez pas utilisé addToBackStack(). ÉVITEZ d'utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X