2015-08-29 17 views
12

Ich habe eine Android-Anwendung, die Zustand in Bezug auf zurückgelegte Strecke, verstrichene Zeit, etc. hält. Diesen Zustand kann ich bequem in einem Objekt speichern und einen Verweis auf das Objekt im Bundle speichern, wenn Android anruft onDestroy(), wenn der Benutzer die Bildschirmausrichtung ändert und dann den Status in onCreate (Bundle savedBundle) wiederherstellt. Ich habe jedoch auch einen Zustand in den Schaltflächen und EditText-Objekten auf dem Bildschirm, die ich durch Bildschirmausrichtungen beibehalten möchte. Zum Beispiel in onStart (Bundle savedBundle) Ich nenne:Android Zustand auf Orientierungsänderung speichern

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

Dann während der gesamten Operation meiner app, die Farben/aktivierte Status dieser Tasten wird geändert. Gibt es eine bequemere Möglichkeit, den Status von Benutzeroberflächenelementen (EditText, Button-Objekte usw.) beizubehalten, ohne jedes Attribut für jede Schaltfläche manuell speichern/wiederherstellen zu müssen? Es fühlt sich sehr ungeschickt an, diesen Zustand zwischen den Bildschirmausrichtungen manuell verwalten zu müssen.

Danke für jede Hilfe.

Antwort

39

Haben Sie versucht, mit: seine Arbeit durch

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

in Manifest-Datei?

Es funktioniert nicht standardmäßig, weil, wenn Sie die Ausrichtung ändern onCreate wird erneut aufgerufen und es Ihre Ansicht neu gezeichnet.

Wenn Sie diesen Parameter nicht in Aktivität schreiben müssen, kümmert sich das Framework um den Rest der Dinge. Der Status des Bildschirms oder Layouts bleibt erhalten, wenn die Ausrichtung geändert wird.

HINWEIS Wenn Sie ein anderes Layout für den Querformatmodus verwenden, wird durch Hinzufügen dieser Parameter das Layout für den Querformatmodus nicht aufgerufen.

Other way und Another way

+1

Nizza Antwort, hat mir geholfen, die "configChanges" –

+2

Wow, es wirklich zu verstehen ist, dass einfach ... Addi Diese Zeile zu meinem Manifest löste mein Problem. Jetzt scheint mein gesamter Status durch eine Orientierungsänderung zu bestehen, ohne den Status manuell in einem Bundle speichern zu müssen. OnCreate/onDestroy werden bei einer Orientierungsänderung nicht mehr aufgerufen. Danke dafür! – Intervention

+2

Ich bin neu in Android und ich glaube nicht, dass das so einfach ist. Was ist der Haken? Warum ist dies nicht standardmäßig aktiviert? Es muss eine Art von Nachteil auf diesem .. –

5

Ihre Variable speichern oder Werte, die Sie onSaveInstanceState (Bundle) verwendet werden soll; und wenn sich die Ausrichtung ändert, sollten Wiederherstellungswerte auch onRestoreInstanceState() verwenden, aber nicht sehr häufig. (onRestoreInstanceState() nach onStart() aufgerufen, während onCreate() vor onStart() aufgerufen wird. Verwenden Sie die Put-Methoden Werte speichern in onSaveInstanceState()

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

und Wiederherstellung der Werte in onCreate():

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

Danke für die Antwort.Ich war eigentlich auf der Suche nach einer Möglichkeit, diese manuelle Bundle-Management-Arbeit in onCreate und onSaveInstanceState nicht zu machen, weshalb ich stattdessen ranjiths Antwort akzeptierte - aber das sind sicherlich gute Informationen zu dieser Frage. – Intervention

Verwandte Themen