356 votes

Comprendre setRetainInstance de Fragment (booléen)

En commençant par la documentation

public void setRetainInstance (boolean conserver)

Contrôler si un fragment de l'instance est conservé à travers l'Activité de re-création (par exemple, un changement de configuration). Ce ne peut être utilisé avec des fragments de pas dans la pile de retour. Si elle est définie, le fragment du cycle de vie sera légèrement différente lorsqu'une activité est recréée:

  • onDestroy() ne sera pas appelé (mais onDetach() seront toujours, parce que le fragment est détaché de son activité actuelle).
  • onCreate(Bundle) ne sera pas appelé depuis le fragment est pas besoin d'être re-créé.
  • onAttach(Activité) et onActivityCreated(Bundle) sera toujours appelé.

J'ai quelques questions:

  • Le fragment de les conserver, ou de ce que ce sera recréé sur la modification de la configuration - qu'est-ce exactement est "engagé"?

  • Sera le fragment être détruites lorsque l'utilisateur quitte l'activité?

  • Pourquoi ne pas travailler avec des fragments sur la pile de retour?

  • Qui sont les cas d'utilisation où il est raisonnable d'utiliser cette méthode?

359voto

Alex Lockwood Points 31578

Tout d'abord, découvrez mon post sur la rétention de Fragments. Cela pourrait aider. :)

Maintenant, pour répondre à vos questions...

Le fragment de conserver sa vue de l'état, ou ce que ce sera recréé sur la modification de la configuration - qu'est-ce exactement est "engagé"?

Oui, l' Fragments'etat seront conservés à travers le changement de configuration. Plus précisément, les "non" signifie que le fragment de ne pas être détruits sur les modifications de la configuration. Qui est, l' Fragment sera conservé même si le changement de configuration des causes sous-jacentes Activity à être détruit.

Sera le fragment être détruites lorsque l'utilisateur quitte l'activité?

Tout comme Activitys, Fragments peut être détruite par le système lorsque les ressources de mémoire sont faibles. Si vous avez vos fragments conservent leur état de l'instance à travers les modifications de la configuration n'aura aucun effet sur si oui ou non le système va détruire l' Fragments une fois que vous quittez l' Activity. Si vous laissez l' Activity (c'est à dire en appuyant sur le bouton home), l' Fragments peut ou ne peut pas être détruit. Si vous laissez l' Activity en appuyant sur le bouton back (donc, en appelant finish() et efficace de détruire l' Activity), tous les de la Activitys attaché Fragments seront également détruites.

Pourquoi ne pas travailler avec des fragments sur la pile de retour?

Il y a sans doute de multiples raisons pour lesquelles il n'est pas pris en charge, mais la raison la plus évidente pour moi, c'est que l' Activity contient une référence à l' FragmentManager, et l' FragmentManager gère la backstack. Qui est, peu importe si vous choisissez de conserver votre Fragments ou non, Activity (et donc l' FragmentManagers'backstack) seront détruites à un changement de configuration. Une autre raison pourquoi il ne pourrait pas travailler est parce que les choses pourraient être si difficile à la fois conservé des fragments et de la non-rétention de fragments ont été autorisés à exister sur le même backstack.

Qui sont les cas d'utilisation où il est raisonnable d'utiliser cette méthode?

Rétention de fragments peut être très utile pour propager des informations de l'état - en particulier la gestion des threads, - à travers les instances d'activité. Par exemple, un fragment peut servir d'hôte pour une instance de Thread ou AsyncTask, la gestion de son fonctionnement. Voir mon billet de blog sur ce sujet pour plus d'informations.

En général, je voudrais traiter de la même manière à l'aide d' onConfigurationChanged avec un Activity... ne l'utilisez pas comme un bandaid juste parce que vous êtes trop paresseux pour mettre en oeuvre et gérer un changement d'orientation correctement. Utiliser uniquement quand vous en avez besoin pour.

28voto

suitianshi Points 1390

setRetaininstance est seulement utile quand votre activity est détruit et recréé en raison d'un changement de configuration, car les cas sont enregistrés lors d'un appel à l' onRetainNonConfigurationInstance. C'est, si vous faites pivoter l'appareil, la rétention de fragments restera là(ils ne sont pas détruits et recréés.) mais lorsque le moteur d'exécution tue l'activité pour récupérer des ressources, rien n'est laissé. Lorsque vous appuyez sur le bouton de retour et la sortie de l'activité, tout est détruit.

Habituellement j'utilise cette fonction pour sauvé l'orientation de l'évolution des Temps.Dire que j'ai télécharger un tas d'images depuis le serveur, et chacun est de 1 mo, lorsque l'utilisateur accidentellement tourner son appareil, je ne veux certainement pas à faire tout le téléchargement de travailler à nouveau.J'ai donc créer un Fragment holding mon bitmaps et l'ajouter à la manager et le call setRetainInstance,toutes les images sont toujours là, même si l'orientation de l'écran change.

13voto

user696876 Points 81

SetRetainInstance(true) permet le fragment sorte de survivre. Ses membres seront conservés pendant le changement de configuration comme la rotation. Mais il peut quand même être tué lorsque l'activité est tué dans l'arrière-plan. Si le contenant de l'activité en arrière-plan est tué par le système, c'est instanceState doivent être enregistrés par le système, vous avez géré onSaveInstanceState correctement. En d'autres termes, la onSaveInstanceState sera toujours appelé. Si onCreateView ne sera pas appelé si SetRetainInstance est vrai et le fragment/activité n'est pas tué, cependant, il sera appelé si elle est tuée et être essayé d'être ramené.

Voici une analyse de l'android activité/fragment espère que cela aide. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html

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