web-dev-qa-db-fra.com

Méthodes de fragmentation: attach (), detach (), remove (), replace (), popBackStack ()

Je suis très confus entre ces fonctions et leurs objectifs. Ce que j'ai observé que l'utilisation de replace() remplace le fragment existant par un nouveau. Nous pouvons utiliser addToBackStack(null) pour mettre ce fragment dans la pile arrière afin que nous puissions revenir au fragment montré précédemment. Maintenant, quand un fragment est ajouté (ou remplacé) - onAttach() -> onCreate() etc .... les méthodes du fragment sont appelées dans l'ordre.

Maintenant, quand nous appelons remove() sur le fragment de notre activité, quelles fonctions du fragment sont appelées et dans quel ordre?

Que font attach() et detach()? detach() supprime-t-il le fragment? Et lorsque ces deux attach() et detach() sont utilisées, quelles fonctions du fragment sont appelées et dans quel ordre ??

De plus, que se passe-t-il sur popBackStack() ?? Je veux dire quelles fonctions sont appelées lorsque nous utilisons popBackStack() sur le fragment de notre activité ??

Et quand onDestroy () s'appelle ??

Merci.

33
Vikram Gupta

Maintenant, quand nous appelons remove () sur le fragment de notre activité, quelles fonctions du fragment sont appelées et dans quel ordre?

Regardez http://developer.Android.com/reference/Android/app/Fragment.html .

L'ordre est le suivant: onPause(), onStop(), onDestroyView(), onDestroy(), onDetach()

Que font attach () et detach ()? Detach () supprime-t-il le fragment? Et lorsque ces deux attach () et detach () sont utilisés, quelles fonctions du fragment sont appelées et dans quel ordre ??

attach() et detach() est respectivement associe ou détache le Fragment avec/du Activity. Lors de l'attachement de Fragment, la méthode de cycle de vie onAttach() est appelée, lors du détachement, la méthode de cycle de vie onDetach() est appelée dans Fragment. Pour plus d'informations, consultez le lien ci-dessus.

De plus, que se passe-t-il sur popBackStack () ?? Je veux dire quelles fonctions sont appelées lorsque nous utilisons popBackStack () sur le fragment de notre activité ??

Si Fragment n'a pas été détruit, alors sur popBackStack() les méthodes onStart() et onResume() sont appelées. Si le Fragment a été détruit précédemment, alors les méthodes de cycle de vie seront appelées à partir de onAttach(). C'est la même chose que lorsque vous appuyez sur le bouton de retour sur Activities.

24
Adam L. Mónos

Juste une note sur popBackStack(). Il n'éclate pas un fragment, il éclate une transaction de fragment. Donc, quelle que soit la dernière transaction de fragment, elle est inversée. Si vous montriez un FragmentA et que votre transaction était:

fragmentTransaction.replace(R.id.your_layout, fragmentB);
fragmentTransaction.addToBackStack(null);

Il remplacerait FragmentA par FragmentB et ajouterait cette transaction (pas le fragment) à la pile arrière. Si vous appuyez ensuite sur le bouton Précédent, il fait apparaître la pile arrière et obtient la transaction, qui était "remplacer ce FragmentA par un FragmentB". Il annule ensuite cette transaction. En arrière, l'instruction consiste à remplacer le fragment actuel par FragmentA. Si le FragmentA d'origine existe toujours, il l'utilise. S'il a été détruit, il en fait un nouveau.

12
emote_control

Supposons que le fragment A et le fragment B aient été ajoutés à un conteneur avec les étapes suivantes:

1. Added fragment A =>  .replace(R.id.container, fragmentA) => addToBackStack(null)
2. Added fragment B =>  .replace(R.id.container, fragmentB) => addToBackStack(null)
3. Removed fragment B => fragmentManager.popBackStack();

Rappels lorsque fm.popBackStack () est appelé:

FragmentB: onPause()
FragmentB: onStop()
FragmentB: onDestroy()
FragmentB: onDetach()
FragmentA: onCreateView()
FragmentA: onViewCreated()
FragmentA: onActivityCreated()
FragmentA: onStart()
FragmentA: onResume()

Explication: Pourquoi lors de la suppression et de la destruction du fragment B à l'aide de popBackStack (), la vue du fragment A a été à nouveau créée et reprise?

Rép: lorsque vous avez ajouté le fragment B, vous avez utilisé replace () et addToBackStack (), tous les fragments ont donc été supprimés du conteneur et le fragment B a été ajouté au conteneur. Et, cette transaction a également été enregistrée dans la pile Back. Ainsi, lorsque fm.popBackStack () est appelé, la transaction est d'abord extraite de la pile arrière et donc les opérations se sont rétablies, donc le fragment b est supprimé du conteneur et détruit. Et tous les autres fragments sont ajoutés, car la vue du fragment A de notre cas est ajoutée au conteneur. A également noté que le fragment A onAttach & onCreate () n'est pas appelé car il a déjà été créé et attaché à MainActivity plus tôt.

Une pression arrière sur le fragment B fait la même chose:

If you press the back button, it calls fm.popBackStack() and pops the transaction.
4
Richa