36 votes

Sauvegarde de l'objet lors d'un changement d'orientation

Comment sauver l'objet lors d'un changement d'orientation, depuis onRetainNonConfigurationInstance y getLastNonConfigurationInstance sont obsolètes. Et qui ne peuvent pas être utilisés avec compatibility package android-support-v4.jar FragmentActivity où il est indiqué Cannot override the final method from FragmentActivity

site du développeur dire

Utilisez plutôt la nouvelle API Fragment setRetainInstance(boolean) ;

Mais je ne sais pas comment enregistrer un objet personnalisé à l'aide de setRetainInstance

Mon scénario :
Dans mon activité, j'ai une AsyncTask avec un dialogue de progression. Ici, je dois gérer le changement d'orientation.
Mark Murphy, CommonsWare, m'a donné une très bonne réponse à ce sujet.
background-task-progress-dialog-orientation-change-is-there-any-100-working ,
avec exemple de projet

Puisque j'utilise le paquet de compatibilité Android-support-v4.jar, FragmentActivity Je ne peux pas passer outre onRetainNonConfigurationInstance
Impossible de surcharger la méthode finale de FragmentActivity

Existe-t-il une autre méthode pour enregistrer mon objet personnalisé ?

EDIT : Je ne peux pas rendre ma tâche AsyncTask Parcelable (si je ne me trompe pas) puisqu'elle utilise une interface, un contexte, etc. Mon AsyncTask

 public class CommonAsyncTask extends AsyncTask<Object, Object, Object>  {
        Context context;
        AsyncTaskServices callerObject;
        ProgressDialog progressDialog;
        String dialogMessag ; 
    ................

Je cherche, y a-t-il des alternatives pour onRetainNonConfigurationInstance qui permet de sauvegarder complètement un objet lors d'un changement d'orientation et qui peut être récupéré ultérieurement à l'aide de la méthode getLastNonConfigurationInstance

42voto

Giorgi Points 15760

Vous pouvez utiliser onRetainCustomNonConfigurationInstance.

A utiliser à la place de onRetainNonConfigurationInstance(). Récupérer plus tard avec getLastCustomNonConfigurationInstance().

12voto

Nikolay Elenkov Points 32843

Il y a deux possibilités :

  1. Utiliser un Loader . Les FragmentActivity se chargera de sauvegarder/restaurer son état lors de la recréation.
  2. Utiliser un fragment sans vue et appeler setRetainInstance(true) sur celui-ci. Il y a un exemple de cela dans les sources de la bibliothèque de compatibilité, FragmentRetainInstanceSupport ou quelque chose comme ça.

5voto

Graeme Points 9167

Lorsque votre fragment est en pause, il appelle cette méthode :

@Override
public void onSaveInstanceState(Bundle outState) {
    // Add variable to outState here
    super.onSaveInstanceState(outState);
}

La variable outState sera ensuite introduite dans la méthode onCreate() lors du redémarrage du fragment.

Vous pouvez enregistrer n'importe quelle donnée qui est un type de base ou qui met en œuvre la fonction Parcelable interface

-1voto

xjaphx Points 7156

Eh bien, c'est une citation de Android Developers' References :

Cette méthode est appelée après onStart() lorsque l'a réinitialisée à partir d'un état précédemment sauvegardé, donné ici dans savedInstanceState. La plupart des implémentations utiliseront simplement onCreate(Bundle) pour restaurer leur état, mais il est parfois nécessaire d'utiliser la méthode parfois pratique de le faire ici après que toute l'initialisation a été faite ou de permettre aux sous-classes de décider d'utiliser ou non votre par défaut. L'implémentation par défaut de cette méthode effectue une restauration de tout état de vue qui avait été précédemment gelé par onSaveInstanceState(Bundle).

En ce qui concerne l'utilisation des onSaveInstanceState() il est préférable d'inverser vos objets/choses en utilisant la fonction onRestoreInstanceState() au lieu de cela.

Se référer à Activity#onRestoreInstanceState()

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