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.

Je pense que c'est la raison pour laquelle: "Si vous n'appelez pas addToBackStack() lorsque vous effectuez une transaction qui supprime un fragment, alors que le fragment est détruite lorsque la transaction est validée et l'utilisateur ne peut pas revenir en arrière. Tandis que si vous faites appel addToBackStack() lors de la suppression d'un fragment, puis le fragment est arrêté et sera repris si l'utilisateur navigue en arrière." Lorsque vous utilisez addToBackStack(), les fragments sont arrêtés et retenus. Voir: developer.android.com/guide/components/...

OriginalL'auteur Tar_Tw45 | 2013-12-19