comment revenir à fragment précédent en appuyant manuellement sur le bouton back de fragment individuel?

j'ai un activity et plusieurs fragments dans mon application.

deux fragments Principaux A(à gauche) et B (à droite).

Fragment A1 called from A

B1 called from B

B2 called from B1

fragments avoir des boutons arrière individuels.

alors quand j'appuie sur le bouton arrière de fragment A1, il devrait revenir à , de la même façon lorsque le bouton de retour de B2 est enfoncée, B1 et B1 B et ainsi de suite sur.

Comment mettre en œuvre ce type de fonctionnalité?

21
demandé sur abhishek gupta 2013-01-11 13:57:37

10 réponses

public void onBackPressed()
{
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack();
}
31
répondu Manitoba 2013-01-11 10:10:13

j'ai mis en place le scénario similaire tout à l'heure.

l'Activité " A "- > Appels d'un Fragment de " A1 " et en cliquant sur l'élément de menu, il appelle le Fragment 'A2' et si l'utilisateur appuie sur le bouton de retour de 'A2', cela revient à " A1 "et si l'utilisateur appuie sur le dos de" A1 "après cela, il termine l'Activité" A " et remonte.

voir le Code suivant:

Activité " A " - Oncréate() Méthode:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activityA);

    if (savedInstanceState == null) {
        Fragment fragInstance;

        //Calling the Fragment newInstance Static method
        fragInstance = FragmentA1.newInstance();

        getFragmentManager().beginTransaction()
                .add(R.id.container, fragInstance)
                .commit();
    }
}

Fragment: 'A1'

je remplace le fragment existant par le nouveau Fragment lorsque l'action du clic sur le menu se produit:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_edit_columns) {
        //Open the Fragment A2 and add this to backstack
        Fragment fragment = FragmentA2.newInstance();
        this.getFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .addToBackStack(null)
                .commit();

        return true;
    }
    return super.onOptionsItemSelected(item);
}

l'Activité " A " - onBackPressed() Méthode:

puisque tous les fragments ont une activité parent (qui est 'A'), la méthode onBackPressed() vous permet de pop les fragments s'il y en a un ou simplement de retourner à la précédente Activité.

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
    else {
        getFragmentManager().popBackStack();
    }
}

si vous cherchez des Fragments à L'intérieur de Fragments, reportez-vous au lien suivant: http://developer.android.com/about/versions/android-4.2.html#NestedFragments

20
répondu TrueBlue 2015-02-25 02:22:18

la réponse de@trueblue m'a fait avancer avec un problème mineur mais ennuyeux. Quand il n'y a qu'un fragment sur le dos et que vous appuyez sur le bouton back, ce cadre est enlevé et l'application reste active avec un écran blanc. L'Utilisateur a besoin d'appuyer sur le bouton arrière une fois de plus pour sortir de l'application. J'ai modifié le code original comme suit afin de gérer cette situation

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
    else if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        getFragmentManager().popBackStack();
    }
}

Lorsqu'il n'y a qu'un seul fragment dans le dos, nous disons en gros à android de déplacer toute l'application vers arrière.

mise à Jour (et probablement une meilleure réponse)

donc après avoir fait plus de lecture autour de cela, j'ai découvert que vous pouvez ajouter des transactions fragment manager à la pile arrière et ensuite android gère les presses arrière automatiquement et de la manière souhaitée. L'extrait de code ci-dessous montre comment le faire

Fragment fragment; //Create and instance of your fragment class here
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(null);

la dernière ligne indique comment ajouter un mouvement à la pile arrière. Cela résout problème de presse pour les fragments dans la plupart des situations, sauf pour un. Si vous appuyez sur le bouton Retour, vous atteindrez éventuellement un point où il n'y a qu'un fragment dans la pile arrière. À ce stade, vous voulez faire une des deux choses

  1. enlever le boîtier d'activité du fragment de la pile arrière de la tâche dans laquelle l'activité est en cours. C'est parce que vous ne voulez pas finir avec une activité vierge
  2. si l'activité est la seule activité dans la pile arrière de la tâche, puis pousser la tâche dans fond.

Dans mon cas, c'était le plus tard, j'ai donc modifié le substituée onBackPressed méthode de ma réponse précédente à ressembler à ci-dessous

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        super.onBackPressed();
    }
}

ce code est plus simple car il a moins de logique et repose sur le framework que sur notre code personnalisé. Malheureusement, je n'ai pas réussi à mettre en œuvre le code pour la première situation que je n'avais pas besoin.

11
répondu Suhas 2016-08-03 19:52:00

vous devez implémenter votre propre implémentation backstack comme expliqué ici.

Vous pouvez appeler le popFragments() chaque fois que vous cliquez sur le bouton précédent dans un fragment et appelez pushFragments() chaque fois que vous naviguez d'un Fragment à l'autre.

4
répondu TNR 2017-05-23 11:55:14

Ne

getActivity().getFragmentManager().popBackStack();
4
répondu HaveNoDisplayName 2015-10-02 06:12:42

essayez ceci, son travail pour moi.

public void onBackPressed() {
    if (mainLayout.isMenuShown()) {
        mainLayout.toggleMenu();
    } else {
        FragmentManager fm = getSupportFragmentManager();
        Log.print("back stack entry", fm.getBackStackEntryCount() + "");

        if (fm.getBackStackEntryCount() > 1) {
            fm.popBackStack();
            // super.onBackPressed();
            // return;
        } else {
            if (doubleBackToExitPressedOnce) {
                fm.popBackStack();
                super.onBackPressed();
                return;
            }

            this.doubleBackToExitPressedOnce = true;
            Toast.makeText(this, "Press one more time to exit",
                    Toast.LENGTH_SHORT).show();

            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {

                    doubleBackToExitPressedOnce = false;
                }
            }, 3000);

        }
    }
}
1
répondu Shreyans Patel 2015-05-28 07:04:00

le bouton arrière va traverser dans l'ordre, dans lequel les Fragments étaient ajouté à backstack. Ceci est fourni comme une fonction de navigation par défaut. Maintenant, si vous voulez aller de Fragment spécifique, vous pouvez afficher à partir de backstack.

0
répondu S.D. 2013-01-11 10:06:40

Vous pouvez le manipuler en ajoutant dans la balise backStack. Cochez ma réponse ici:

https://stackoverflow.com/a/19477957/1572408

j'espère que ça aide

0
répondu Rudi 2017-05-23 10:29:54
@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){

                // replace your fragment here

                return true;

            }

            return false;
        }
    });
}

// Bon Codage

-1
répondu Hiren Patel 2014-11-26 09:00:11

si vous appuyez sur image arrière vous devez créer la méthode d'abord comme ceci

private void Backpresses() {
    getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contant_main, new Home()).commit();
}

alors vous devez appeler comme ça quand vous appuyez sur image arrière..

 back.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   Backpresses();

                }
            });

Il fonctionne très bien pour moi.

-1
répondu S HemaNandhini 2016-10-05 07:49:00