346 votes

Différence entre add(), replace() et addToBackStack()

Quelle est la principale différence entre l'appel de ces méthodes :

fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);

Que signifie remplacer un fragment déjà existant, et ajouter un fragment à l'état d'activité, et ajouter une activité à la pile arrière ?

Deuxièmement, avec findFragmentByTag() cette recherche porte sur les balises ajoutées par le add() / replace() ou la méthode addToBackStack() méthode ?

373voto

JeeZ Points 1097

Une autre différence importante entre add y replace c'est ça :

replace supprime le fragment existant et ajoute un nouveau fragment. Cela signifie que lorsque vous appuyez sur le bouton "retour", le fragment qui a été remplacé sera créé avec son nom. onCreateView étant invoquée. Alors que add conserve les fragments existants et ajoute un nouveau fragment, ce qui signifie que les fragments existants seront actifs et qu'ils ne seront pas en état de "pause" lorsqu'on appuiera sur le bouton "retour". onCreateView n'est pas appelé pour le fragment existant (le fragment qui était là avant que le nouveau fragment soit ajouté).

En termes d'événements du cycle de vie du fragment onPause , onResume , onCreateView et d'autres événements du cycle de vie seront invoqués en cas de replace mais ils ne seront pas invoqués en cas de add .

Editar : Il faut faire attention si elle utilise une sorte de bibliothèque de bus d'événements comme L'Eventbus de Greenrobot et réutiliser le même fragment pour empiler le fragment sur d'autres via add . Dans ce scénario, même si vous suivez la meilleure pratique et que vous enregistrez le bus d'événements dans l'application onResume et se désinscrire dans onPause Dans ce cas, le bus d'événements serait toujours actif dans chaque instance du fragment ajouté, comme le montre l'exemple suivant add ne fera appel à aucune de ces méthodes du cycle de vie des fragments. En conséquence, l'écouteur du bus d'événements dans chaque instance active du fragment traitera le même événement, ce qui n'est peut-être pas ce que vous voulez.

1 votes

Je pense qu'une approche pourrait consister à traiter l'événement dans le fragment le plus haut et à appeler cancelEventDelivery() une fois le traitement terminé. Pour en savoir plus sur les méthodes cancelEventDelivery(), cliquez ici. github.com/greenrobot/EventBus/blob/master/

7 votes

+1 de ma part. Il est très important de savoir que le remplacement du fragment actuel par un nouveau fragment, signifie que le fragment précédent sera recréé pour le récupérer lors du retour de la pile de fragments.

0 votes

OnPause, onResume est étroitement associé à l'activité de l'hôte. Et ils n'ont pas appelé lors du remplacement du fragment.

365voto

Ved Prakash Points 7244

1) fragmentTransaction.addToBackStack(str);

Description - Ajoutez cette transaction à la pile arrière. Cela signifie que l'on se souviendra de la transaction après qu'elle ait été validée, et qu'elle inversera son opération lorsqu'elle sera retirée de la pile.

2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

Description - Remplacer un fragment existant qui a été ajouté à un conteneur. C'est essentiellement la même chose que d'appeler remove(Fragment) pour tous les fragments actuellement ajoutés qui ont été ajoutés avec le même containerViewId et ensuite add(int, Fragment, String) avec les mêmes arguments donnés ici.

3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)

Description - Ajouter un fragment à l'état d'activité. Ce fragment peut éventuellement avoir sa vue (si Fragment.onCreateView renvoie une valeur non nulle) dans une vue de conteneur de l'activité.

Que signifie remplacer un fragment déjà existant, et ajouter un fragment à l'état d'activité et ajouter une activité à la pile arrière ? pile ?

Il existe une pile dans laquelle sont conservées toutes les activités en cours d'exécution. Les fragments appartiennent à l'activité. Vous pouvez donc les ajouter pour les intégrer dans une activité.

Vous pouvez combiner plusieurs fragments dans une seule activité pour construire une interface utilisateur à plusieurs volets et réutiliser un fragment dans plusieurs activités. Ceci est essentiellement utile lorsque vous avez défini votre conteneur de fragments dans différentes mises en page. Il vous suffit de le remplacer par un autre fragment dans n'importe quelle disposition.

Lorsque vous naviguez dans la mise en page actuelle, vous disposez de l'id de ce conteneur pour le remplacer par le fragment que vous souhaitez.

Vous pouvez également revenir au fragment précédent dans le backStack avec la fonction popBackStack() méthode. Pour cela vous devez ajouter ce fragment dans la pile en utilisant addToBackStack() et ensuite commit() pour réfléchir. On procède dans l'ordre inverse, le courant étant en haut.

findFragmentByTag recherche-t-il les balises ajoutées par la méthode add/replace ou la méthode addToBackStack ?

Cela dépend de la façon dont vous avez ajouté la balise. Il trouve alors simplement un fragment par sa balise que vous avez définie auparavant, soit lorsqu'il est gonflé à partir du XML, soit lorsqu'il est fourni lors de l'ajout dans une transaction.

Références : FragmentTransaction

2 votes

Donc, puis-je ajouter le fragment par la méthode de remplacement au début de l'activité initiée ?

0 votes

(Aucun fragment n'a été ajouté auparavant)

2 votes

Un conteneur de fragment peut-il contenir plus d'un fragment ? Si oui, comment la méthode replace() se comportera-t-elle ? Est-ce qu'elle remplacera tous les fragments dans ce conteneur ou l'API Android a une méthode qui accepte trois arguments, c'est-à-dire frgamentContainer, nouveau fragment et avec qui le remplacer.

147voto

Phan Van Linh Points 16963

Exemple une activité a 2 fragments et nous utilisons FragmentManager à remplacer/additionner par addToBackstack chaque fragment à une disposition dans l'activité

Utiliser remplacer

Go Fragment1

Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume

Go Fragment2

Fragment2: onAttach
Fragment2: onCreate
Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume

Pop Fragment2

Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

Fragment Pop1

Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach

Utilisez l'ajout

Go Fragment1

Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume

Go Fragment2

Fragment2: onAttach
Fragment2: onCreate
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume

Pop Fragment2

Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach

Fragment Pop1

Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach

Exemple de projet

118voto

Rohit Singh Points 1934

Voici une photo qui montre la différence entre add() y replace()

enter image description here

Alors add() La méthode continue à ajouter des fragments sur le dessus de le fragment précédent dans FragmentContainer.

Alors que replace() méthodes efface tous les le Fragment précédent à partir de Containers, puis l'ajouter dans FragmentContainer.

Qu'est-ce que addToBackStack

addtoBackStack peut être utilisée avec les méthodes add() et replace. Elle sert un objectif différent dans l'API Fragment.

Quel est le but ?

L'API de fragment, contrairement à l'API d'activité, n'est pas accompagnée de Bouton de navigation arrière par défaut. Si vous voulez revenir au Fragment précédent, nous utilisons la méthode addToBackStack() dans le Fragment. Comprenons les deux

Cas 1 :

getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.fragmentContainer, fragment, "TAG")
            .addToBackStack("TAG")
            .commit();

enter image description here

Cas 2 :

getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.fragmentContainer, fragment, "TAG")
            .commit();

enter image description here

54voto

Javi Points 51

Bien qu'il s'agisse d'une vieille question à laquelle on a déjà répondu, peut-être que les exemples suivants peuvent compléter la réponse acceptée et qu'ils peuvent être utiles à certains nouveaux programmeurs Android comme moi.

Option 1 - "addToBackStack()" n'est jamais utilisé

Cas 1A - ajouter, supprimer et cliquer sur le bouton Retour

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

Cas 1B - ajouter, remplacer, et cliquer sur le bouton Retour

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

Option 2 - "addToBackStack()" est toujours utilisé

Cas 2A - ajouter, supprimer et cliquer sur le bouton Retour

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Fragment B is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Cas 2B - ajouter, remplacer, supprimer et cliquer sur le bouton Retour

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView()  
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()   
Fragment B :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Option 3 - "addToBackStack()" n'est pas toujours utilisé (dans les exemples ci-dessous, w/o indique qu'il n'est pas utilisé)

Cas 3A - ajouter, supprimer et cliquer sur le bouton Retour

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Cas 3B - ajouter, remplacer, supprimer et cliquer sur le bouton Retour

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()   
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X