web-dev-qa-db-fra.com

Fragment PopBackStack

Je reçois un problème étrange en utilisant Fragments et en les repassant.

J'ai une activité de fragment:

Étape 1: Je joins un fragment à la création onCreate de cette activité dans le fragment nommé de départ A en tant que:

Ceci est l'activité onCreate of Fragment

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
    }

Étape: 2 Ensuite, j'ai joint le fragment avec le code suivant:

Fragment_More moreFragment = new Fragment_More();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();

Étape 3: Après cela, j'ai ajouté un fragment supplémentaire sur Fragment_More de la même manière:

Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();

et voici l'activité de mon fragment sur BackPressedButton Lisetener:

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    Fragment f = fm.findFragmentById(R.id.frameContent);

 if(fm.getBackStackEntryCount() > 1){
         fm.popBackStack();
    } else{
        finish();
    }
}

Voici le problème que je reçois:

Lorsque je retourne à l'étape 3, le fragment précédent me parvient avec succès, comme décrit par onBackPressed. Mais à partir de Fragment_More, lorsque je réappuie, le contenu de FRAGMENT est vide. Il ne montre jamais le premier fragment que j'avais ajouté à l'étape 1 de la création de l'activité.

Commentez s'il vous plaît. Qu'est ce que je fais mal ?

Merci

16
Gaurav Arora

Vous ne devez pas ajouter votre premier fragment à l’arrière-pile, car appuyer sur la touche Retour ne fera que renverser l’action que vous avez effectuée. Donc, si vous remplacez un fragment et que vous appuyez en retour, le remplacement que vous avez effectué sera inversé. Mais si vous appuyez de nouveau sur une transformation de fragment '.add()', elle le supprimera simplement et vous affichera une page vierge. Je pense donc que le fait de retirer le premier fragment de la pile devrait faire l'affaire. Essayez-le et faites le moi savoir!

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).commit();
    }

EXEMPLE:

Alors disons que vous avez deux fragments appelés A & B 

Si vous .add() fragmentez A à la page et "addToBackStack()" (= enregistrez le contraire de l'action), vous aurez enregistré le fragment REMOVE A en tant qu'action lorsque vous cliquez à nouveau sur.

Si vous .replace() fragmentez A par fragment B, ainsi que "addToBackStack()", vous aurez enregistré la suppression B et ajouté A comme action. quand vous cliquez sur retour.

Vous voyez donc pourquoi ce n’est pas une bonne pratique d’ajouter votre première transformation de fragments au backstack? Cela entraînera simplement la suppression du fragment A en appuyant en arrière, ce qui produira une page vierge. J'espère que c'est assez d'infos.

En outre, une fois que vous avez supprimé la fonction addToBackStack() de votre premier fragment, vous n'avez pas besoin de remplacer la fonction onBackPressed(), car cela fonctionnera comme prévu. Il ne fera que terminer l'activité lorsqu'il ne restera plus rien dans la pile sans vous montrer d'abord cette page vierge.

45
Chris

Votre ligne:

if(fm.getBackStackEntryCount() > 1){

devrait être:

if (fm.getBackStackEntryCount() > 0) {

Vous mettez 3 fragments sur le backstack. Une fois que vous avez supprimé les deux premières entrées, le nombre d'entrées sur le backstack est égal à 1. Vous vous empêchez donc de récupérer le premier fragment ajouté au backstack.

2
Jerry Frost

vous utilisez ce manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

essayez d'utiliser ceci à la place manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

Faites-moi savoir si cela fonctionne pour vous

0
omujeebr