FragmentTransaction : remplacer et addToBackStack de ne pas travailler ensemble?
Je suis assez nouveau au développement Android et maintenant en cours d'exécution à des comportements bizarres.
- J'ai un vide FrameLayout être le contenant d'un fragment.
- Si l'utilisateur presse un bouton pour la première fois, de créer de nouvelles Fragment et mis à l'intérieur du conteneur.
- Si l'utilisateur presse un bouton plus tard, et il existe fragment à l'intérieur du contenant, de remplacer l'existant avec nouvellement créée.
- Si l'utilisateur presse le bouton retour, pop loin le fragment à l'intérieur du contenant.
Voici mon code
public void showFragment(View v) {
FragmentA f = new FragmentA();
FragmentManager fm = getSupportFragmentManager();
String tag = f.getFragmentTag(); //instance method of a to get a tag
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_top, 0, 0, R.anim.slide_out_top);
ft.replace(R.id.container, f, tag);
ft.addToBackStack(tag);
ft.commit();
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
} else {
super.onBackPressed();
}
}
Lorsque l'utilisateur presse le bouton pour la première fois, il se comporter comme ce que j'attendais, ajouter un nouveau fragment de récipient. Mais, le deuxième temps de l'utilisateur appuyez sur le bouton tout en conteneur contient encore un fragment, au lieu de les remplacer, ajouter sur le dessus de l'existant. Donc, 2 fragments à l'intérieur du conteneur, 2 à l'arrière appuyez sur pour supprimer tous les fragments.
J'ai trouvé que si je supprime la ligne
ft.addToBackStack();
Et retravailler la onBackPress() la méthode comme suit, il fonctionne à nouveau comme je l'ai prévu (1 fragment de récipient à un moment)
en gros, supprimer manuellement fragment au lieu de popFromBackStack méthode
private FragmentA currentFragment = null; //to hold the reference to exising fragment, if any.
@Override
public void onBackPressed() {
if (currentFragment != null) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(0, R.anim.slide_out_top);
ft.remove(currentFragment);
ft.commit();
currentFragment = null;
} else {
super.onBackPressed();
}
}
Donc, ma question sont
- remplacer et addToBackStack est de ne pas travailler ensemble?
- ou, ai-je fait quelque chose de mal?
Apprécions tous les commentaires et suggestions.
OriginalL'auteur Tar_Tw45 | 2013-12-19
Vous devez vous connecter pour publier un commentaire.
addToBackstack
crée un instantané de vos fragments d'état. Ce qui signifie que lorsque vous appuyez sur la touche retour, vous êtes en fait de revenir au dernier état queaddToBackstack
a été appelé.Dans votre cas, vous ajoutez un Fragment. Le bouton de retour serait de supprimer cet ajout de fragment. Lorsque vous appelez le remplacer, et ajouter à la backstack encore une fois, vous avez maintenant deux états sur la backstack (1. quand vous avez eu le premier fragment ajouté, 2. lorsque vous n'aviez pas de fragments ajoutés). Si vous le dos bouton pour supprimer le fragment, ne pas utiliser de addToBackstack. Utilisez uniquement addToBackstack lorsque vous souhaitez conserver à l'état de fragments dans une vue.
Oui, il semble que vous n'avez pas besoin addToBackstack pour votre cas d'utilisation
sur l'Android developer site developer.android.com/training/implementing-navigation/... ils disent que vous devriez utiliser addToBackStack pour fournir le bon de retour de la navigation lors de la navigation entre les fragments. Quels sont vos arguments ne pas les utiliser? Et 2: "Dans votre cas, vous ajoutez un Fragment. Le bouton de retour serait de supprimer cet ajout de fragment. Lorsque vous appelez le remplacer, et ajouter à la backstack encore une fois, vous avez maintenant deux états sur la backstack". Lorsque, à son code-t-il ajouter un fragment? Je ne vois replace()
OriginalL'auteur Spidy
Pour ceux qui sont toujours à la recherche de solution.
Dans les principaux
Activity
classe (qui héberge les fragments)de substitueronBackPressed()
.Il n'y a pas de
onBackPressed()
méthode du fragment, et cette méthode est juste pour leactivity
. Donc,quand on appuie sur la touche retour, le comportement par défaut deactivity
est montré, ce qui estMaintenant nous avons besoin de surcharger cette méthode pour raconter l'
activity
que quand on appuie sur la touche retour, s'il y a des fragments dans la pile de retour, de la pop (et c'est quand leaddToBackStack()
entre en image). Autrement, suivre le comportement par défaut.trouver plus de détails ici ici
OriginalL'auteur KhogaEslam