Quelle est la différence entre détacher un fragment et le supprimer?
118
Dans la documentation Android pour FragmentTransaction, j'ai remarqué deux méthodes très similaires: detachet remove. Les descriptions là-bas ne semblent pas donner beaucoup d'informations sur le moment de les utiliser, 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 conservé par le gestionnaire de fragments. Cela signifie que vous pouvez réutiliser ce fragment en appelant la méthode attach, avec une ViewHierarchy modifiée
Supprimer signifie que l'instance de fragment ne peut pas être réattachée. Vous devrez l'ajouter à nouveau à la transaction de fragment.
Commentaire de la source
Vous remarquerez que lorsqu'un Fragment est détaché, ses méthodes onPause, onStop et onDestroyView sont appelées uniquement (dans cet ordre). En revanche, 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 du fragment sont appelées uniquement; et lors de l'ajout, les méthodes onAttach, onCreate, onCreateView, onStart et onResume du Fragment sont appelées (dans cet ordre). - Adil Hussain
Pour ajouter à la réponse de Rajdeep, vous remarquerez que lorsqu'un Fragmentest détaché , ses onPause, onStopet les onDestroyViewméthodes sont appelées uniquement (dans cet ordre). D'autre part, lorsqu'un Fragmentest retiré , ses onPause, onStop, onDestroyView, onDestroyet les onDetachméthodes sont appelées (dans cet ordre). De même, lorsque la fixation , les Fragment« s onCreateView, onStartet les onResumeméthodes sont appelées uniquement; et quand l' ajout , les Fragment« s onAttach, onCreate, onCreateView, onStartet onResumeméthodes sont appelées (dans cet ordre).
Adil Hussain
1
Il y a une question rapide avec Diane Hackborn ici . Alors pourquoi ai-je ce journal? Comment savez-vous que FT.detach () a été appelé?
Poutrathor
1
Quel est l'avantage de l'un par rapport à l'autre? Je veux connaître un cas d'utilisation où l'un est favorable par rapport à l'autre? J'ajoute et supprime toujours, est-ce mauvais?
Neon Warge
1
Meilleure clarification courte et concise.
Robotec
55
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 babillards électroniques (voir les commentaires ci-dessus). Je me suis fait une petite démo pour comprendre comment les choses fonctionnent réellement. Voici mes conclusions. N'hésitez pas à me corriger si je me trompe.
Pour ajouter initialement un fragment à une activité, vous 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 du cycle de vie qui en résultent et d'autres valeurs de retour de méthode importantes:
Autres choses importantes à noter: si vous détachez un fragment et que vous essayez de l'ajouter à nouveau en utilisant add () plutôt que attach (), rien ne semble changer.
si vous essayez d'ajouter un fragment qui a été supprimé à l'aide de remove () en utilisant attach () plutôt que add (), rien ne semble changer.
Lorsque getView () renvoie null, le fragment peut toujours avoir des références internes à la dernière vue qu'il a créée. Cette vue n'est plus valide et ne doit pas être utilisée.
Fragment
est détaché , sesonPause
,onStop
et lesonDestroyView
méthodes sont appelées uniquement (dans cet ordre). D'autre part, lorsqu'unFragment
est retiré , sesonPause
,onStop
,onDestroyView
,onDestroy
et lesonDetach
méthodes sont appelées (dans cet ordre). De même, lorsque la fixation , lesFragment
« sonCreateView
,onStart
et lesonResume
méthodes sont appelées uniquement; et quand l' ajout , lesFragment
« sonAttach
,onCreate
,onCreateView
,onStart
etonResume
méthodes sont appelées (dans cet ordre).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 babillards électroniques (voir les commentaires ci-dessus). Je me suis fait une petite démo pour comprendre comment les choses fonctionnent réellement. Voici mes conclusions. N'hésitez pas à me corriger si je me trompe.
Pour ajouter initialement un fragment à une activité, vous 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 du cycle de vie qui en résultent et d'autres valeurs de retour de méthode importantes:
Pour supprimer un fragment d'une activité, vous utilisez: getFragmentManager (). BeginTransaction (). Remove (mFragment) .commit ().
Cela supprime toute association avec une vue ou une activité.
Voici les événements du cycle de vie qui en résultent et d'autres valeurs de retour de méthode importantes:
J'ai rajouté le fragment ici
Pour détacher un fragment ajouté d'une activité, vous utilisez: getFragmentManager (). BeginTransaction (). Detach (mFragment) .commit ().
Cela supprime toute association avec une vue, mais conserve l'association avec l'activité.
Voici les événements du cycle de vie qui en résultent et d'autres valeurs de retour de méthode importantes:
Pour rattacher un fragment qui a été détaché à l'activité, utilisez: getFragmentManager (). BeginTransaction (). Attach (mFragment) .commit ().
Cela crée une nouvelle vue à associer au fragment et maintient l'association d'activité.
Voici les événements du cycle de vie qui en résultent et d'autres valeurs de retour de méthode importantes:
Autres choses importantes à noter: si vous détachez un fragment et que vous essayez de l'ajouter à nouveau en utilisant add () plutôt que attach (), rien ne semble changer.
si vous essayez d'ajouter un fragment qui a été supprimé à l'aide de remove () en utilisant attach () plutôt que add (), rien ne semble changer.
Lorsque getView () renvoie null, le fragment peut toujours avoir des références internes à la dernière vue qu'il a créée. Cette vue n'est plus valide et ne doit pas être utilisée.
la source