Ce que je savais déjà, c'est:
après fragmentTransaction.replace()
, la fonction onStop()
du fragment actuel sera appelée tandis que fragmentTransaction.add()
ne le sera pas.
et après avoir appelé fragMgr.popBackStack();
, nous reviendrons au fragment précédent peu importe fragmentTransaction.replace
ou fragmentTransaction.add()
est utilisé
Alors, que fait fragmentTransaction.replace
?
Je peux comprendre que nous pouvons "ajouter" un fragment sur un fragment précédent et revenir plus tard au fragment précédent par popBackStack()
, MAIS:
si le fragment précédent est "remplacé" par le fragment actuel, je suppose que le fragment précédent est supprimé et que le fragment actuel est ajouté, comment peut-il revenir au fragment précédent lorsque popBackStack()
est appelé?
Vous pouvez ajouter plusieurs fragments dans un conteneur et ils seront superposés les uns sur les autres. Si vos fragments ont des arrière-plans transparents, vous verrez cet effet et pourrez interagir avec les multiples fragments en même temps.
C'est ce qui se passera si vous utilisez FragmentTransaction.add sur un conteneur. Votre fragment ajouté sera placé au-dessus de votre fragment existant.
Si vous utilisez FragmentTransaction.replace(R.id.container,fragment)
il supprimera tous les fragments qui sont déjà dans le conteneur et ajoutera votre nouveau dans le même conteneur.
Vous pouvez également utiliser la méthode add sans identifiant de conteneur et votre fragment sera simplement ajouté à la liste des fragments dans FragmentManager et vous pouvez les rappeler à tout moment par leur valeur de balise.
Vous pouvez toujours revenir à une configuration précédente SI vous avez ajouté la transaction à la pile arrière. Vous pouvez le faire même si une opération précédente a supprimé un fragment. Le fragment supprimé est mémorisé dans la transaction et le popping de la pile arrière le ramène.
Disons que vous avez un conteneur de fragments.
Et votre tâche consiste à ajouter un fragment dans le conteneur.
Vous pouvez le faire en appelant l'une des méthodes suivantes
1) add(containerId,fragment)
2) replace(containerId,fragment)
Bien que les deux méthodes ajoutent votre fragment dans le conteneur de fragments, leurs entrailles (fonctionnement interne) diffèrent en fonction des deux états possibles du conteneur de fragments .
Lorsque le conteneur de fragments
1) ne contient aucun fragment.
2) possède déjà un ou plusieurs fragments.
Voyons ce qui se passe lorsque nous appelons la méthode add()
et replace()
.
Dans ce cas, les deux méthodes ajouteront le fragment au conteneur. Ils produiront donc le même effet .
add()
: ajoute le nouveau fragment en haut un autre fragmentreplace()
: supprime tout puis ajoute le nouveau fragment
Exemple
Supposons donc que le conteneur Fragment ait fragments[A->B->C]
.
Vous voulez maintenant ajouter un nouveau fragment D
.add()
le résultat de la méthode sera [A->B->C->D]
replace()
le résultat de la méthode sera [D]
Vérifiez ceci Projet de démonstration pour une meilleure compréhension.