1

J'ai un fragment, par exemple A -> B -> C. Quand je suis dans le fragment C, et appuyez sur le bouton retour, je dois obtenir un fragment A C'est-à-dire que le fragment B n'est pas nécessaire à ajouter à backStack. Voici le code qui implémente la transition entre les fragments.Retour du fragment C au fragment A en appuyant sur le bouton précédent

FragmentManager fragmentManager = this.getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 

Fragment fragment = fragmentManager.findFragmentByTag(tag); 
fragment.getArguments().putAll(args); 

transaction.replace(idContainer, fragment, tag); 
transaction.addToBackStack(null); 
transaction.commit(); 

A l'ouverture du fragment C, je ne pas utiliser transaction.addToBackStack (null);

Et maintenant j'ai le problème suivant. Du fragment С je clique sur le bouton retour et entre dans le fragment A, mais deux couches de fragments se superposent l'une à l'autre.

Like this screenshot

+0

Ajoutez tous les fragments dans le backstack, puis itérez pour la boucle jusqu'au premier fragment – Bhavnik

+0

utilisez-vous viewpager? –

+0

Peut-être que vous voulez vérifier [cette question] (http://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack) –

Répondre

-1

Lorsque vous appelez Transaction.addToBackStack(null), votre Fragment ajouté à backstack, vous ne devriez pas appeler quand vous ne voulez pas ajouter votre fragment à backstack.

Ce que vous devez faire

Lorsque vous remplacez votre Fragment-A avec Fragment-B vous ne devriez pas appeler Transaction.addToBackStack(null), mais quand vous remplacez Fragment-B avec Fragment-C vous devez appeler Transaction.addToBackStack(null).

Faire ce votre Fragment-A et Fragment-C sera backstacked mais Fragment-B ne sera pas, maintenant lorsque vous appuyez sur le bouton de retour, vous aurez Fragment-A.

0

Vous pouvez utiliser le code suivant dans Fragment_C Pour revenir à Fragment_A sur le bouton de presse Retour de fragment_C

@Override 
public void onResume() { 

    super.onResume(); 

    getView().setFocusableInTouchMode(true); 
    getView().requestFocus(); 
    getView().setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 

      if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ 


       Fragment_A fragment = null; 
       fragment = new Fragment_A(); 

       FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.container_body, fragment); 
       fragmentTransaction.commit(); 


       return true; 

      } 

      return false; 
     } 
    }); 
} 
0

transition de A à B

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new BFragment(), "BFragment").addToBackStack("A_TO_B").commit(); 

Transition de B à C

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new CFragment(), "CFragment").addToBackStack("B_TO_C").commit(); 

Remplacer la méthode onBackPressed() de Activity Activity.

@Override 
public void onBackPressed(); 
if (getSupportFragmentManager().findFragmentByTag("CFragment") != null) { 
    getSupportFragmentManager().popBackStack("A_TO_B", 
    FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} else { 
     super.onBackPressed(); 
     } 
}