42 votes

Quand utiliser FragmentManager::putFragment et getFragment

J'ai une application qui utilise des fragments et je me demandais comment utiliser le même fragment dans une activité avec un double volet et une activité autonome. Je ne suis toujours pas sûr de la meilleure méthode pour y parvenir, mais j'ai remarqué que le FragmentManager possède une fonction putFragment et getFragment. Ce qui me perturbe, c'est que vous devez fournir un Bundle comme paramètre aux fonctions get et put. Comment des activités distinctes peuvent-elles avoir le même Bundle ? Il est évident que vous pouvez passer le Bundle en tant que paramètre, mais à ce stade, j'ai l'impression que vous ne faites qu'empirer les choses.

Quel est donc le bon scénario pour utiliser getFragment et putFragment ? Veuillez inclure l'explication du paramètre Bundle.

60voto

hackbod Points 55292

La réponse de base :

Ils ne sont utiles que lors de l'implémentation de onSaveInstanceState() et de la restauration de cet état dans onCreate(). Si vous n'implémentez pas onSaveInstanceState(), vous pouvez oublier ces méthodes et faire comme si elles n'existaient pas.

Le problème qu'ils résolvent : si vous voulez sauvegarder une référence à un fragment dans votre "état d'instance sauvegardé", vous ne pouvez pas simplement y mettre une référence d'objet. D'abord parce que vous ne pouvez pas mettre un objet simple dans un Bundle :) Et la raison en est que le but de cet état sauvegardé est d'être copié hors de votre processus, de sorte que si votre processus doit être tué, il peut plus tard être copié dans un nouveau processus pour que vous réinitialisiez votre activité/fragment. Un objet brut n'a de sens que dans le contexte du processus dans lequel il est exécuté, il n'est donc pas possible de copier correctement la référence à un tel objet hors de votre processus actuel et dans un autre.

Ainsi, ce que putFragment()/getFragment() fait est de placer un morceau de données dans le Bundle donné qui peut identifier ce fragment à travers une nouvelle instance de votre activité/fragment dans un autre processus. La nature exacte de cette représentation n'est pas définie, mais dans l'implémentation actuelle, il s'agit de l'identifiant entier interne de ce fragment, qui sera utilisé ultérieurement lorsque le FragmentManager devra recréer ce fragment à partir d'un état précédemment sauvegardé... il est recréé avec ce même identifiant, de sorte que lorsque vous appelez ensuite getFragment(), il peut récupérer l'entier et l'utiliser pour déterminer l'objet Fragment correct à renvoyer à l'appelant, qui correspond à celui qui a été précédemment sauvegardé.

19voto

polen Points 241

En bref, c'est juste la façon dont vous pouvez récupérer la référence du fragment après Activity est rétabli. Par exemple, lorsque vous créez un fragment et que vous l'utilisez dans toute votre activité, donc après un changement de configuration, votre activité est recréée, vous voulez récupérer cette référence. Donc

public void onSaveInstanceState(Bundle outState){
   getFragmentManager().putFragment(outState,"myfragment",myfragment);
}
public void onRetoreInstanceState(Bundle inState){
   myFragment = getFragmentManager().getFragment(inState,"myfragment");
}

2voto

Macarse Points 36519

Vous avez une bonne explication de ce que put|getFragment peut être utilisé dans ce Fil de discussion du groupe Android .

Bien que l'ensemble du fil de discussion soit intéressant, la véritable réponse à votre question a été donnée par Dianne Hackborn".

Vous pouvez également tirer parti des FragmentManager pour sauvegarder un un "pointeur" de fragment dans un bundle et le récupérer ultérieurement, afin de vous permettre de maintenir des pointeurs directs à travers l'état sauvegarder/restaurer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X