Fragments Android: quand utiliser masquer / afficher ou ajouter / supprimer / remplacer?

117

Supposons que je souhaite remplacer le fragment actuel dans une vue de conteneur par une autre. Vaut-il mieux utiliser remplacer ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... ou ce qui suit, avec afficher et masquer?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

Une façon de procéder est-elle plus efficace? Impossible de trouver beaucoup d'informations sur l'utilisation de ces méthodes ou sur la manière dont elles affectent le cycle de vie des fragments impliqués. Merci!

Robert Karl
la source
si je vais au fragment B du fragment A, puis je retourne au fragment A, comment puis-je m'assurer que l'événement du cycle de vie tel que onCreateView n'appelle pas le fragment A? la recherche fragment par tag fonctionne-t-elle?
blackHawk

Réponses:

135

Vous devez réfléchir à ce que vous prévoyez de faire avec le fragment pour décider du chemin à suivre. Si vous utilisez une FragmentTransaction pour masquer le fragment, il peut toujours être dans l'état d'exécution de son cycle de vie, mais son interface utilisateur a été détachée de la fenêtre afin qu'elle ne soit plus visible. Vous pouvez donc techniquement toujours interagir avec le fragment et rattacher son interface utilisateur plus tard. Si vous remplacez le fragment, vous le retirez en fait du conteneur et il passera par tous les événements de démontage dans le cycle de vie (onPause, onStop, etc.) et si pour une raison quelconque vous avez à nouveau besoin de ce fragment, vous devrez insérez-le de nouveau dans le conteneur et laissez-le exécuter à nouveau toute son initialisation.

S'il y a une forte probabilité que vous ayez à nouveau besoin de ce fragment, masquez-le simplement car c'est une opération moins coûteuse pour redessiner sa disposition que pour la réinitialiser complètement.

David C. Sainte-Claire
la source
5
Pour nos besoins, l'initialisation du fragment est assez coûteuse, donc nous allons probablement aller avec hide()et show()économiser sur cela! Merci pour cela!
Robert Karl
2
Salut, quand vous dites détacher de la fenêtre, voulez-vous dire que le rappel onDetach () sera appelé? J'ai expérimenté ça, il semble que ce ne soit pas le cas.
GingerJim
il voulait probablement dire «détacher»; un fragment peut également être détaché / rattaché (en plus pour ajouter / supprimer, afficher / masquer)
comeGetSome
1
@Zainodis, j'ai le même problème aussi. Ma solution est de sauvegarder l'état caché du fragment dans onSaveInstanceState () - savedInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); puis dans onCreate () if (savedInstanceState! = null) récupère l'état caché et si le fragment est caché, cachez-le avec la transaction.
worawee.s
1
@ worawee.s Salut et merci pour la mise à jour :)! J'ai résolu le problème il y a quelque temps de mon côté - je n'avais pas vraiment besoin de cacher / afficher, etc. donc je l'ai complètement abandonné et maintenant je vais avec des normes telles que les activités d'ajout / remplacement ou de fragment unique dans un seul volet (flux de détail principal en gros) . Pour ceux qui utilisent encore hide, votre solution sera vraiment utile - et ne pas vérifier saveInstance! = Null était l'une des erreurs que j'ai faites auparavant.
AgentKnopf
5

Vous vous êtes essentiellement répondu. Si vous souhaitez remplacer (si l'ancien fragment n'est plus nécessaire), utilisez replace()si vous souhaitez le masquer temporairement, faites-le hide().

Marcin Orlowski
la source
Fondamentalement, le remplacement supprime tout. Je n'ai pas trouvé le hideAll correspondant :(
AlikElzin-kilaka
@ AlikElzin-kilaka Dans mon activité 3 fragment dans les trois fragments, je récupère des données du réseau quelle méthode je dois suivre
Mansukh Ahir
0

J'ai utilisé la méthode hide / Show dans mon activité avec 4 fragments, cela a résolu ma solution, mais quelque temps au hasard, lorsque je montre ma boîte de dialogue, cela donne une exception de jeton de fenêtre lorsque j'ai utilisé la méthode d'ajout et de remplacement, alors une mauvaise exception de jeton ne se produit pas, donc je pense que show / la méthode de masquage n'est pas parfaite

Dishant Kawatra
la source