web-dev-qa-db-fra.com

Revenir par programme au fragment précédent dans le backstack

Disons que j'ai une activité à laquelle des fragments ont été ajoutés par programme:

private void animateToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

Quel est le meilleur moyen de revenir au fragment précédent qui était visible?

J'ai trouvé fonctionnalité du bouton arrière du déclencheur sur le clic du bouton dans Android mais je pense que simuler un événement de touche arrière n'est pas la bonne façon de s'y prendre (et je ne peux pas le faire fonctionner non plus ):

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));

L'appel de finish() ferme simplement l'activité qui ne m'intéresse pas.

Y a-t-il une meilleure façon de s'y prendre?

196
Aske B.

Regardez les méthodes getFragmentManager().popBackStack() (vous pouvez en choisir plusieurs)

http://developer.Android.com/reference/Android/app/FragmentManager.html#popBackStack ()

328
stuckless

Pour élaborer sur les autres réponses fournies, voici ma solution (placée dans une activité):

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}
121
Kyle Falconer

Quand nous mettons à jour/ajoutons les fragments,

Devrait inclure la .addToBackStack().

getSupportFragmentManager().beginTransaction()
    .add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
    .addToBackStack(null)
    .commit();

Après cela, si nous donnons la getFragments.popBackStackImmediate() retournera la valeur true si nous ajoutons/mettons à jour les fragments et si nous retournons à l'écran actuel.

25
Jabeer

Ajoutez ces lignes à votre méthode onBackPressed (). La méthode popBackStackImmediate () vous ramènera au fragment précédent si vous en avez un sur la pile

if(getFragmentManager().getBackStackEntryCount() > 0){
     getFragmentManager().popBackStackImmediate();
}
else{
    super.onBackPressed();
}

`

8
Avijit Biswas

Cette solution fonctionne parfaitement pour la navigation par fragments dans la barre inférieure lorsque vous souhaitez fermer l'application lorsque vous appuyez de nouveau sur le fragment principal.

Par contre, lorsque vous ouvrez le fragment secondaire (fragment en fragment) qui est défini comme "DetailedPizza" dans mon code, il retournera l'état précédent du fragment primaire. À votre santé !

Les activités intérieures au dos pressées mettent ceci:

Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");

if (home instanceof FragmentDetailedPizza && home.isVisible()) {
    if (getFragmentManager().getBackStackEntryCount() != 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
} else {
    //Primary fragment
    moveTaskToBack(true);
}

Et lancez l'autre fragment comme ceci:

Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();
4
Giedrius Šlikas

Revenez par programme au fragment précédent en utilisant le code suivant.

if ( getFragmentManager().getBackStackEntryCount() > 0) 
{
          getFragmentManager().popBackStack();
          return;
}
super.onBackPressed();
1
Piyush MandaliYa

Pour que ce fragment revienne, ajoutez simplement ce fragment dans le backstack sur lequel vous souhaitez revenir, par exemple:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Fragment fragment = new LoginFragment();
        //replacing the fragment
        if (fragment != null) {
            FragmentTransaction ft = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment);
            ft.addToBackStack("SignupFragment");
            ft.commit();
        }
    }
});

Dans le cas ci-dessus, j'ouvre LoginFragment lorsque l'on appuie sur Button button, l'utilisateur est maintenant dans SignupFragment. Donc, si addToBackStack(TAG) est appelé, où TAG = "SignupFragment", puis lorsque le bouton de retour est enfoncé dans LoginFragment, nous revenons à SignUpFragment.

Bon codage!

1
Saurabh Singh

Essayez ci-dessous le code:

@Override
    public void onBackPressed() {
        Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.container);
        if (myFragment != null && myFragment instanceof StepOneFragment) {
            finish();
        } else {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
        }
    }
0
adarsh

En ajoutant fragment_tran.addToBackStack(null) sur le dernier fragment, je peux revenir sur le dernier fragment.

ajout d'un nouveau fragment:

view.findViewById(R.id.changepass).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.container, new ChangePassword());
            transaction.addToBackStack(null);
            transaction.commit();
        }
    });
0
Baljinder Maan