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
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 ().
setUserVisibleHint sera appelé lorsque le fragment est visible ou non visible