web-dev-qa-db-fra.com

Android enregistrer l'état lors du changement d'orientation

J'ai une application Android qui maintient l'état concernant la distance parcourue, le temps écoulé, etc. Cet état que je peux facilement stocker dans un objet et stocker une référence à cet objet dans le Bundle lorsque Android appelle onDestroy () lorsque l'utilisateur modifie l'orientation de l'écran, puis restaurez l'état dans onCreate (Bundle savedBundle). Cependant, j'ai également un état dans les objets Buttons et EditText à l'écran que je souhaite conserver à travers les orientations de l'écran. Par exemple, dans onStart (Bundle savedBundle) j'appelle:

_timerButton.setBackgroundColor(Color.GREEN);
_pauseButton.setBackgroundColor(Color.YELLOW);
_pauseButton.setEnabled(false);

Ensuite, tout au long du fonctionnement de mon application, les couleurs/l'état activé de ces boutons seront modifiés. Existe-t-il un moyen plus pratique de conserver l'état des éléments de l'interface utilisateur (EditText, objets Button, etc.) sans avoir à enregistrer/restaurer manuellement chaque attribut pour chaque bouton? Il est vraiment maladroit de devoir gérer manuellement ce type d'état entre les orientations d'écran.

Merci pour toute aide.

27
Intervention

Avez-vous essayé d'utiliser: son travail

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

dans le fichier manifeste?

Cela ne fonctionne pas par défaut car, lorsque vous modifiez l'orientation, onCreate sera appelé à nouveau et il redessine votre vue.

Si vous écrivez ce paramètre sans besoin de le gérer dans Activity, le framework s'occupera du reste des choses. Il conservera l'état de l'écran ou de la mise en page si l'orientation est modifiée.

[~ # ~] note [~ # ~] Si vous utilisez une disposition différente pour le mode paysage, en ajoutant ces paramètres, la disposition pour le mode paysage sera ne pas être appelé.

Autre manière et Autre manière

82
Ranjith Kumar

Pour enregistrer votre variable ou vos valeurs, vous devez utiliser onSaveInstanceState (Bundle); et lorsque l'orientation change, les valeurs doivent alors être récupérées et doivent également utiliser onRestoreInstanceState (), mais ce n'est pas très courant. (onRestoreInstanceState () est appelé après onStart (), tandis que onCreate () est appelé avant onStart (). Utilisez les méthodes put pour stocker les valeurs dans onSaveInstanceState ( )

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putLong("param", value);
}

Et restaurez les valeurs dans onCreate ():

public void onCreate(Bundle icicle) {
  if (icicle != null){
    value = icicle.getLong("param");
  }
}
15
Androider