web-dev-qa-db-fra.com

différence entre fragmentTransaction.add et fragmentTransaction.replace

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é?

25
Wood

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.

52
Kuffs

Deux choix

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)

Mais les deux méthodes diffèrent par leur comportement !!!

enter image description here 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().

Cas 1: Quand aucun fragment n'est attaché dans un conteneur

Dans ce cas, les deux méthodes ajouteront le fragment au conteneur. Ils produiront donc le même effet .

Cas 2: lorsque le fragmentContainer a déjà un fragment/fragments

add(): ajoute le nouveau fragment en haut un autre fragment
replace(): 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]

Lien pertinent:

Vérifiez ceci Projet de démonstration pour une meilleure compréhension.

17
Rohit Singh