web-dev-qa-db-fra.com

Pourquoi utiliser Fragment # setRetainInstance (booléen)?

Je trouve le fragment # setRetainInstance (vrai) déroutant. Voici le Javadoc, extrait de Android Developer API :

public void setRetainInstance (booléen retenir)

Contrôlez si une instance de fragment est conservée lors de la recréation d'activité (par exemple à partir d'un changement de configuration). Cela ne peut être utilisé qu'avec des fragments qui ne sont pas dans la pile arrière. S'il est défini, le cycle de vie du fragment sera légèrement différent lorsqu'une activité est recréée:

  • onDestroy () ne sera pas appelé (mais onDetach () le sera toujours, car le fragment est détaché de son activité actuelle).
  • onCreate (Bundle) ne sera pas appelé car le fragment n'est pas en cours de recréation.
  • onAttach (Activity) et onActivityCreated (Bundle) seront toujours appelés.

Question: Comment utilisez-vous cela en tant que développeur et pourquoi cela facilite-t-il les choses?

62
Håvard Geithus

Comment utilisez-vous en tant que développeur

Appelez setRetainInstance(true). Je le fais généralement dans onCreateView() ou onActivityCreated(), où je l'utilise.

et pourquoi cela facilite-t-il les choses?

Il a tendance à être plus simple que onRetainNonConfigurationInstance() pour gérer la conservation des données à travers les changements de configuration (par exemple, faire pivoter l'appareil de portrait en paysage). Les fragments non retenus sont détruits et recréés lors du changement de configuration; les fragments retenus ne le sont pas. Par conséquent, toutes les données détenues par ces fragments conservés sont disponibles pour l'activité post-modification de la configuration.

80
CommonsWare

Il est très utile pour garder ouvertes les ressources de longue durée, telles que les sockets. Avoir un fragment sans interface utilisateur qui contient des références aux prises Bluetooth et vous n'aurez pas à vous soucier de les reconnecter lorsque l'utilisateur retourne le téléphone.

Il est également utile de conserver les références aux ressources qui prennent beaucoup de temps à charger, comme les bitmaps ou les données du serveur. Chargez-le une fois, conservez-le dans un fragment conservé, et lorsque l'activité est rechargée, elle est toujours là et vous n'avez pas besoin de la reconstruire.

45
DeeV

Ajout de cette réponse très tard, mais je pensais que cela clarifierait les choses. Répétez après moi. Lorsque setRetainInstance est:

FALSE

  • Le fragment est recréé lors du changement de configuration. NOUVELLE INSTANCE est créée.
  • TOUTES les méthodes de cycle de vie sont appelées lors d'un changement de configuration, y compris onCreate () et onDestroy ().

VRAI

  • Le fragment n'est pas recréé lors du changement de configuration. MÊME INSTANCE est utilisée.
  • Toutes les méthodes de cycle de vie sont appelées lors d'un changement de configuration, APART FROM onCreate () et onDestroy ().
  • La conservation d'une instance ne fonctionnera pas lorsqu'elle sera ajoutée à la backstack.

N'oubliez pas que ce qui précède s'applique aux DialogFragments ainsi qu'aux Fragments.

27
Eurig Jones