57 votes

Comment sauvegarder l'état lors du changement d'orientation sous Android si l'état est fait de mes classes?

J'ai été en regardant la façon dont Android poignées de changement d'orientation pour ma demande (j'ai découvert qu'il redémarre le mainactivity sur changement d'orientation. J'ai vu que vous pouvez remplacer la méthode

protected void onSaveInstanceState(Bundle outState)

Pour enregistrer des trucs, puis faites-le dans onStart. Le problème est que j'ai mon point de vue avec des objets personnalisés et une listview à l'aide d'un adaptateur personnalisé. Tout est dans un ArrayList de ces objets, mais j'ai remarqué que vous ne pouvez pas mettre des objets arbitraires dans le bundle! Alors, comment puis-je sauver l'état?

138voto

Rahul Patil Points 1232

Avez-vous essayé d'utiliser: son travail à travers

<activity name= ".YourActivity" android:configChanges="orientation|screenSize"/>

dans le fichier de Manifeste?

Il ne fonctionne pas par défaut parce que , lorsque vous modifiez l'orientation onCreate sera appelée de nouveau et il redessine votre point de vue.

Si vous écrivez ce paramètre pas besoin de gérer l'Activité , le cadre va prendre soin du reste des choses. Il conserve l'état de l'écran ou de mise en page si l'orientation est modifiée.

REMARQUE Si vous utilisez une mise en page différente pour le mode paysage , par l'ajout de ces paramètres de la mise en page pour le mode paysage ne sera pas appelé.

Autre manière et d' une Autre façon

48voto

Yoni Samlan Points 21748

EDIT: Sur les versions plus récentes d'Android et avec la bibliothèque de compatibilité, conservé des fragments sont généralement le meilleur moyen de gérer en gardant cher-pour-recréer les données vivants à travers l'activité de destruction/création. Et comme Dianne a souligné, en conservant nonconfiguration données pour l'optimisation des choses comme la génération de vignettes qui sont agréables à enregistrer pour des raisons de performances, mais pas essentiels à votre activité fonctionner si elles ont besoin d'être refaite - ce n'est pas un substitut pour la sauvegarde et la restauration de l'activité de l'état.

Mais à l'époque, quand j'ai répondu à cette question, en 2010:
Si vous souhaitez conserver votre propre (non affichage de l'état) de données, vous pouvez passer à l'arbitraire d'un objet spécifiquement pour les changements d'orientation de l'aide d' onRetainNonConfigurationInstance(). Voir cet Développeurs Android blog. Il faut juste faire attention de ne pas mettre tout point de Vue ou d'autres références à la pré-rotation Contexte/l'Activité dans l'objet que vous passez ou que vous allez empêcher les objets de déchets collectés et peut éventuellement exécuter de mémoire (ce qui est appelé un contexte de fuite).

18voto

hackbod Points 55292

Tout d'abord, vous devez déterminer ce qui est réellement "l'état" dans votre application. Vous n'avez pas dit ce que vous êtes en train de faire, mais laissez-moi supposer que la liste de tableaux d'objets, c'est l'état de l'utilisateur travaille.

En Second lieu, décider de ce que le cycle de vie de cet état de fait est. Est-elle vraiment liée à cette activité? Ou si l'utilisateur perd pas dire si leur batterie est faible, l'appareil s'éteint, et plus tard, ils revenir à votre application? Dans le premier cas, onSaveInstanceState() est correcte; dans ce dernier cas, vous aurez envie de les enregistrer pour le stockage persistant dans onPause().

Pour onSaveInstanceState() avec des objets personnalisés, la clé est de mettre en œuvre l'interface Parcelable. Cela implique la mise en œuvre de méthodes sur Parcelable, ainsi que de faire un statique CRÉATEUR objet dans votre classe. Voici le code pour un type simple Parcelable classe:

http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/content/ComponentName.java

Les principales fonctions sont les Parcelable mise en œuvre:

http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/content/ComponentName.java;h=7ca0f01b986924d939b57061966ec8526de9e608;hb=HEAD#l214

et le CRÉATEUR de classe statique:

http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/content/ComponentName.java;h=7ca0f01b986924d939b57061966ec8526de9e608;hb=HEAD#l256

(La statique writeToParcel() et readFromParcel() sont des convenances qui ont été fait pour la classe et n'est pas requise.)

Maintenant que vous avez fait cela, vous pouvez mettre l'ensemble de votre liste de tableaux d'objets dans l'état enregistré Bundle avec le Bundle.putParcelableArrayList:

http://developer.android.com/reference/android/os/Bundle.html#putParcelableArrayList(java.lang.String, java.util.ArrayList)

Dans L'Activité.onCreate(), vérifier pour voir si vous avez un savedState Bundle, et si oui, essaie de récupérer la liste de tableaux de cela et de l'utiliser si elle est trouvée, la création d'une nouvelle carte et de la liste en vue de la nouvelle activité qui sont utilisés pour l'afficher.

3voto

Ε Г И І И О Points 1582

mais j'ai remarqué que vous ne pouvez pas mettre d'objets arbitraires dans le paquet!

Commencez par créer vos objets personnalisés Parcelable .
Ensuite, vous pouvez les mettre dans un paquet.

Tout est dans une ArrayList de ces objets

Vous pouvez utiliser la méthode putParcelableArrayList de l'ensemble pour stocker une liste ArrayList d'objets "parcelable" personnalisés.

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