web-dev-qa-db-fra.com

Comprendre les appels aux méthodes de cycle de vie de Fragment pendant la transaction de fragment

J'ai créé une démo pour comprendre quelles méthodes de cycle de vie de fragment sont appelées dans différents cas de transaction de fragment.Bien que la plupart des appels soient, comme prévu, peu de choses que je suis encore confus que j'ai écrites en gras.

Supposons que deux fragments A et B soient là et que nous effectuons une transaction entre eux

Cas 1

Lorsque le fragment B est ajouté au fragment A

getActivity().getSupportFragmentManager().beginTransaction().add(R.id.container, fragementB).addToBackStack(null).commit();

Fragment B

onAttach

onCreate

onCreateView

onActivityCreated

onStart

pour résumer

Aucune méthode de cycle de vie du fragment A n'est appelée.

Ce à quoi je m'attendais?

la méthode onStop du fragment A est appelée car le fragment A n'est pas visible

Selon la documentation-

Arrêté - Le fragment n'est pas visible. Soit l'activité Host a été arrêtée, soit le fragment a été supprimé de l'activité mais ajouté à la pile arrière. Un fragment arrêté est toujours vivant (toutes les informations d'état et de membre sont conservées par le système). Cependant, il n'est plus visible pour l'utilisateur et sera supprimé si l'activité est supprimée.

Cela signifie-t-il qu'aucune méthode de fragment actuel n'est appelée lorsqu'un nouveau fragment est ajouté dans la même activité?

Puis en utilisant popBackStack() dans le fragment B

Fragment B

onPause

onStop

onDestroyView

onDestroy

onDetach

Aucune méthode de cycle de vie du fragment A n'est appelée

Ce à quoi je m'attendais?

la méthode onStart du Fragment A est appelée car le Fragment A est maintenant visible

Cas 2

Lorsque le fragment B remplace le fragment A

getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).commit();

Fragment B

onAttach

onCreate

onCreateView

onActivityCreated

onStart

pour résumer

Fragment A

onPause

onStop

onDestroyView

onDestroy

onDetach

Tout était comme prévu

Cas 3

Lorsque le fragment B remplace le fragment A en le gardant en backstack

 getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).addToBackStack("tag").commit();

Fragment B

onAttach

onCreate

onCreateView

onActivityCreated

onStart

pour résumer

Fragment A

onPause

onStop

onDestroyView

la méthode onDestroy et onDetach du fragment A n'est PAS appelée. Pourquoi n'est-elle pas appelée? Bcoz selon la méthode de documentation replace supprime tous les fragments qui sont déjà dans le conteneur et ajoutez votre nouveau dans le même conteneur

Puis en utilisant popBackStack() dans le fragment B

Fragment A

onCreateView

onActivityCreated

onStart

pour résumer

Fragment B

onPause

onStop

onDestroyView

onDestroy

onDetach

15
Android Developer

Est-ce à dire qu'aucune méthode de fragment actuel n'est appelée lorsqu'un nouveau fragment est ajouté dans la même activité?

Correct, votre premier fragment A ne sera affecté que s'il est supprimé ou remplacé (cas 2). Ajouter simplement un autre fragment affichera simplement le fragment B sur le fragment A et aucun rappel de cycle de vie ne devrait être appelé.

Ce à quoi je m'attendais?

la méthode onStart du fragment A est appelée car le fragment A est maintenant visible

Encore une fois, puisque le fragment B a été ajouté au-dessus de A, le fragment A n'est pas affecté par la suppression de B.

la méthode onDestroy et onDetach du fragment A n'est PAS appelée. Pourquoi n'est-elle pas appelée? Bcoz selon la méthode de documentation replace supprime tous les fragments qui sont déjà dans le conteneur et en ajoute un nouveau dans le même conteneur

Contrairement à un simple remplacement, lorsque vous ajoutez votre transaction de remplacement au backstack, vous gardez en fait le premier fragment attaché à son activité, seule sa vue est détruite.

Une fois que vous avez ouvert le fragment de backstack B est supprimé et le fragment A va juste recréer sa vue - à partir de onCreateView ().

14
Hanan Rofe Haim

setUserVisibleHint sera appelé lorsque le fragment est visible ou non visible

0
Robin Zhou