Quelle est la différence entre détacher un fragment et le retirer?

Dans les documents Android pour FragmentTransaction, j’ai remarqué deux méthodes très similaires: detach et remove . Les descriptions là-bas ne semblent pas fournir beaucoup de renseignements sur le moment d’utiliser chacune d’elles et d’après ce que je peux dire, elles semblent être les mêmes.

Alors: quelles sont les différences entre ces deux méthodes?

La méthode detach supprime le fragment de l’interface utilisateur, mais son état est géré par le gestionnaire de fragments. Cela signifie que vous pouvez réutiliser ce fragment en appelant la méthode attach, avec un ViewHierarchy modifié

Supprimer signifie que l’instance de fragment ne peut pas être réattachée. Vous devrez l’append à nouveau à la transaction de fragment.

Commentaire source

Vous remarquerez que lorsqu’un fragment est détaché, ses méthodes onPause, onStop et onDestroyView sont appelées uniquement (dans cet ordre). Par contre, lorsqu’un fragment est supprimé, ses méthodes onPause, onStop, onDestroyView, onDestroy et onDetach sont appelées (dans cet ordre). De même, lors de l’attachement, les méthodes onCreateView, onStart et onResume de Fragment sont appelées uniquement; et lors de l’ajout, les méthodes onAttach, onCreate, onCreateView, onStart et onResume de Fragment sont appelées (dans cet ordre). – Adil Hussain

La dénomination des méthodes de gestion des fragments est très déroutante, même selon les ingénieurs de Google sur les forums (voir les commentaires ci-dessus). Je me suis fait une petite démonstration pour comprendre comment les choses fonctionnent réellement. Voici mes conclusions. N’hésitez pas à me corriger si je me trompe.

Pour append initialement un fragment à une activité, utilisez: getFragmentManager (). BeginTransaction (). Add (R.id.container, mFragment) .commit ().

Cela associe l’activité au fragment et associe également une vue au fragment.

Voici les événements de cycle de vie résultants et d’autres valeurs de retour de méthode importantes:

 onAttach() onCreate() onCreateView() onViewCreated() onActivityCreated() onViewStateRestored() onStart() onResume() mFragment.getView() == null: false mFragment.getActivity() == null: false 

Pour supprimer un fragment d’une activité, utilisez: getFragmentManager (). BeginTransaction (). Remove (mFragment) .commit ().

Cela supprime toute association avec une vue ou une activité.

Voici les événements de cycle de vie résultants et d’autres valeurs de retour de méthode importantes:

 onPause() onStop() onDestroyView() onDestroy() onDetach() mFragment.getView() == null: true mFragment.getActivity() == null: true 

J’ai rajouté le fragment ici

Pour détacher un fragment ajouté d’une activité, utilisez: getFragmentManager (). BeginTransaction (). Detach (mFragment) .commit ().

Cela supprime toute association avec une vue, mais conserve l’association avec l’activité.

Voici les événements de cycle de vie résultants et d’autres valeurs de retour de méthode importantes:

 onPause() onStop() onDestroyView() mFragment.getView() == null: true mFragment.getActivity() == null: false 

Pour rattacher un fragment détaché à l’activité, utilisez: getFragmentManager (). BeginTransaction (). Attach (mFragment) .commit ().

Cela crée une nouvelle vue à associer au fragment et conserve l’association d’activité.

Voici les événements de cycle de vie résultants et d’autres valeurs de retour de méthode importantes:

 onCreateView() onViewCreated() onActivityCreated() onViewStateRestored() onStart() onResume() mFragment.getView() == null: false mFragment.getActivity() == null: false 

Autres points importants à noter: Si vous détachez un fragment et que vous essayez de l’append à nouveau en utilisant add () plutôt que par attach (), rien ne semble changer.

Si vous essayez d’append un fragment qui a été supprimé en utilisant remove () en utilisant attach () plutôt que add (), rien ne semble changer.

Lorsque getView () renvoie null, le fragment peut toujours contenir des références internes à la dernière vue créée. Cette vue n’est plus valide et ne doit pas être utilisée.