8
votes

Des fragments encore ajoutés à l'arrière-plan sans appeler addtTobackstackstackstack, pourquoi?

Je fais ma classe d'assistance de changeur de fragment et j'ai un problème avec elle.

Je l'appelle fragmentChanger code> p>

il a un fragmentcontainer code> , qui est un groupe de visit code>, qui contient tous les fragments que je voudrais montrer. p>

J'ai fait mon propre remplacer (fragment fragmenttchange, Boolean NetherAveTobackstackStack) Code > p>

fonction qui est: p>

  • Suppression de l'ancien fragment FOM Le fragmentContainer LI>
  • Ajout d'un nouveau fragment au fragmentContainer LI>
  • enregistre éventuellement à l'arrière-plan, àher NeedAvetObackStack code> est true code> ou false code>. Li>. ul>

    L'erreur est la suivante: p>

    Si j'utilise ma fonction Remplacer par l'enregistrement sur Backstack, il fonctionne correctement, je peux utiliser le bouton arrière de mon périphérique pour vous reculer et revenir à des ajouts prévisibles. Fragments, il fonctionne comme un charme. P>

    mais quand je voudrais remplacer un fragment sans forte> sauvegarder sur l'arrière-plan, il y a quelque chose qui ne va pas dans mon code parce que quand je recule, Je peux voir sur l'écran le fragment que je ne suis pas ajouté à l'arrière-plan fort>, et aussi, je peux voir un autre fragment prévisible à la fois ajouté en même temps! strong> p>

    Donc, je peux voir 2 fragments à la fois même, comme celui-ci: p>

    Entrez une description de l'image Ici p>

    Ceci est mon code: P>

    public class MainActivity extends Activity implements OnClickListener {
    
    // My 3 Fragment Classes, could be N other type,
    // in this example I only got 3
    FragmentA fragmentA;
    FragmentB fragmentB;
    FragmentC fragmentC;
    
    // Button to add the fragments manually
    Button addA, addB, addC;
    
    // This is my activity's container, its a simple viewGroup
    // could be anything that can hold fragments
    ViewGroup fragmentContainer;
    
    // This is my fragment changer helper class that need some revision by you
    // guys
    FragmentChanger fragmentChanger;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //defining my adding buttons
        addA = (Button)findViewById(R.id.addAbtn);
        addB = (Button)findViewById(R.id.addBbtn);
        addC = (Button)findViewById(R.id.addCbtn);
    
        //setting onclicklistenrs
        addA.setOnClickListener(this);
        addB.setOnClickListener(this);
        addC.setOnClickListener(this);
    
        // defining my main container, this will holds fragments
        fragmentContainer = (ViewGroup) findViewById(R.id.fragmentContainer);
    
        // defining my fragments, each of them got an Activity (this), a
        // Container (mainContainer), and a Layout ofc.
        fragmentA = new FragmentA(this, fragmentContainer, R.layout.fragment_a_layout);
        fragmentB = new FragmentB(this, fragmentContainer, R.layout.fragment_b_layout);
        fragmentC = new FragmentC(this, fragmentContainer, R.layout.fragment_c_layout);
    
        // defining my fragment changer with an activity(this), a
        // container(mainContent) and a starting fragment to show!
        fragmentChanger = new FragmentChanger(this, fragmentContainer, fragmentA);
    
    }
    
    @Override
    public void onClick(View view) {
    
        if (view.equals(addA)) {
    
            //When adding fragmentA, i always want to save it to backstack
            fragmentChanger.replace(fragmentA, true);
    
        } else if (view.equals(addB)) {
    
            //I dont want to save to back stack when adding B
            //So if i press back button, i dont want to see fragmentB ever again.
            //(But i do see, this is the error.)
            fragmentChanger.replace(fragmentB, false);
        } else if (view.equals(addC)) {
    
            //When adding fragmentC, i always want to save it to backstack
            fragmentChanger.replace(fragmentC, true);
        }
    
        //After any modification on fragments, i log the backstack
        fragmentChanger.logBackStack();
    
    }
    


2 commentaires

Avez-vous seulement cliqué sur le bouton addb dans votre exemple? Votre activité a commencé et vous avez cliqué uniquement sur "Ajouter B"?


Non, je les poussez à tous dans un ordre aléatoire.


4 Réponses :


0
votes

Essayez de remplacer le fragment à l'aide de fragmentsTransacion.replace méthode comme indiqué dans Link ici

Et vous pouvez faire référence à Cet exemple aussi. Cela fonctionne parfaitement pour moi.


1 commentaires

Comme vous pouvez le voir, j'utilise juste comme ça: fragmenttransaction.replace (fragmentContainer.getid (), fragmenttchange, fragmenttochange.getclass (). GetImplename ());



2
votes

Alors ici ce que j'ai trouvé mal avec votre code:

1) Vous mélangez ensemble des étiquettes de fragment et backstackentry . xxx

Alors, vous obtenez la balise de Backstackentry (non fragment ), que vous ajoutez ou non dans fragmenttransaction.addttobackstackstack () < / code>. Par conséquent, vous obtenez le mauvais état et l'utiliser comme fragment de courant.

2) Il n'est généralement pas une bonne idée de stocker et de réutiliser des fragments comme vous le faites dans vos champs de classe: fragmenta fragmenta; . Cela peut entraîner des problèmes d'état et d'inflation, il est préférable de les créer sur chaque transaction, si vous ne voulez pas résoudre des énigmes supplémentaires.


1 commentaires

Honnêtement, je ne sais pas que c'est vraiment la solution, mais cette réponse est la meilleure et la prime se termine en 1 jour, donc je ne veux donc pas la réputation "perdue" alors c'est ici.



0
votes

Tout d'abord dans le constructeur de votre fragmentChanger , vous ajoutez tous les fragments sur votre dostack. Depuis que vous les ajoutez dans l'ordre d'être ajouté en tant que, B, B, puis C. Après les avoir ajoutés à l'arrière-plan dans cet ordre, vous faites plus de transactions sur le dessus. Tout en les initialisant, évitez d'y ajouter à la marche arrière. Ajoutez uniquement / supprimez-les tandis que le bouton réelle cliquez sur.

Il y a beaucoup de remplaçants dans votre code, donc je ne sais pas comment réparer cela, mais je peux donner un aperçu général de ce que vous devriez faire.

Si vous souhaitez ajouter un fragment à l'arrière-plan, faites un .replace (paramètres) .Addtobackstackstack (tag)

Si vous ne voulez pas ajouter un fragment particulier, ignorez simplement le addtobackstackstack (tag) ligne complètement.

Aussi votre getCurrentfragment () peut être modifié en

fragment CurrentFrag = getfragmentManager (). FINDFRAGMENTBYID (R.ID.FRAGMENT_CONTINAINER);

lire ce Répondre ici pour une meilleure explication et aussi ce Réponse


1 commentaires

"Premièrement, dans le constructeur de votre classe de fragmentsChanger, vous ajoutez tous les fragments sur votre dosseret." Bien non, je ne fais pas.



2
votes

Changer cette ligne xxx

à xxx


0 commentaires