1463 Stimmen

Neustart der Aktivität bei Rotation Android

Wenn ich in meiner Android-Anwendung das Gerät drehe (die Tastatur herausziehe), dann wird mein Activity neu gestartet wird ( onCreate aufgerufen wird). Wahrscheinlich sollte es so sein, aber ich mache einen großen Teil der anfänglichen Einstellungen in der onCreate Methode, ich brauche also beides:

  1. Legen Sie alle anfänglichen Einstellungen in einer anderen Funktion ab, damit sie nicht bei der Rotation des Geräts verloren gehen oder
  2. Mach es so onCreate wird nicht mehr aufgerufen und das Layout wird lediglich angepasst oder
  3. Beschränken Sie die Anwendung auf das Hochformat, damit onCreate nicht aufgerufen wird.

4 Stimmen

Eine recht ausführliche Erklärung, wie man lang laufende asynchrone Tasks bei Änderungen der Aktivitätskonfiguration beibehält, finden Sie unter dieser Blogbeitrag auch!

3 Stimmen

Dies ist keine direkte Antwort, da andere bereits geantwortet haben, aber ich lade Sie ein, einen Blick zu werfen auf LogLifeCycle um zu verstehen, was in Ihren Android-Anwendungen in Bezug auf die Lebenszyklen passiert.

52voto

Liudvikas Bukys Punkte 5560

Ich habe diese Überlieferung gerade erst entdeckt:

Um die Aktivität während eines Orientierungswechsels am Leben zu erhalten, und um sie durch onConfigurationChanged , die Dokumentation y das obige Codebeispiel schlagen Sie dies in der Manifestdatei vor:

<activity android:name=".MyActivity"
      android:configChanges="orientation|keyboardHidden"
      android:label="@string/app_name">

die den zusätzlichen Vorteil hat, dass sie immer funktioniert.

Die Bonusüberlieferung besagt, dass das Weglassen der keyboardHidden mag logisch erscheinen, aber es führt zu Fehlern im Emulator (zumindest für Android 2.1): Die Angabe von nur orientation veranlasst den Emulator zum Aufruf beider OnCreate y onConfigurationChanged manchmal, und nur OnCreate andere Zeiten.

Ich habe den Fehler nicht auf einem Gerät gesehen, aber ich habe gehört, dass der Emulator bei anderen versagt hat. Es lohnt sich also, das zu dokumentieren.

15 Stimmen

Vorsicht! Ab Android 3.2 (API-Level 13) ändert sich die "Bildschirmgröße" auch, wenn das Gerät zwischen Hoch- und Querformat wechselt. Wenn Sie also bei der Entwicklung für API-Level 13 oder höher Laufzeit-Neustarts aufgrund von Ausrichtungsänderungen verhindern wollen, müssen Sie Android:configChanges="orientation|keyboardHidden|screenSize"

40voto

Jon O Punkte 6429

Sie können auch die Möglichkeit der Android-Plattform nutzen, um Daten über Ausrichtungsänderungen hinweg zu erhalten: onRetainNonConfigurationInstance() y getLastNonConfigurationInstance() .

Dies ermöglicht es Ihnen, Daten über Konfigurationsänderungen hinweg zu erhalten, z. B. Informationen, die Sie von einem Server-Fetch erhalten haben, oder etwas anderes, das in onCreate oder seither, wobei Android auch die Möglichkeit bietet, das Layout Ihrer Activity unter Verwendung der xml-Datei für die derzeitige Ausrichtung.

Ver aquí o aquí .

Es sollte beachtet werden, dass diese Methoden nun veraltet sind (obwohl sie immer noch flexibler sind als die Handhabung von Orientierungsänderungen, wie sie die meisten der oben genannten Lösungen vorschlagen), wobei empfohlen wird, dass jeder zu Fragments und verwenden stattdessen setRetainInstance(true) an jedem Fragment die Sie beibehalten wollen.

4 Stimmen

Ich denke wirklich, Fragmente und setRetainInstance ist der beste Weg (und empfohlene Weg von Google), dies zu tun, +1 für Sie und -1 für alle anderen. Hinzufügen von Android:configChanges sollte nur als letztes Mittel eingesetzt werden

34voto

Abdo Punkte 12769

Der Ansatz ist nützlich, aber bei der Verwendung von Fragmenten unvollständig.

Fragmente werden normalerweise bei einer Konfigurationsänderung neu erstellt. Wenn Sie dies nicht wünschen, verwenden Sie

setRetainInstance(true); in dem/den Konstruktor(en) des Fragments

Dies führt dazu, dass die Fragmente bei einer Konfigurationsänderung erhalten bleiben.

http://developer.Android.com/reference/Android/app/Fragment.html#setRetainInstance(boolean)

9 Stimmen

Einverstanden. Mit der neuesten Android-API, scheint es Fragmente sind der richtige Weg, dies zu behandeln. Ich habe noch nicht versucht, es selbst, aber von dem, was ich gesammelt habe Lesen diese Seite Im Grunde verschieben Sie 99 % dessen, was Sie bisher in einer Activity implementiert haben, in eine Unterklasse eines Fragments und fügen dieses Fragment dann der Activity hinzu. Die Activity wird immer noch zerstört und neu erstellt, wenn der Bildschirm rotiert, aber Sie können Android ausdrücklich sagen no um das Fragment zu zerstören, indem Sie die setRetainInstance() Methode, die @Abdo erwähnt hat.

27voto

bass.t Punkte 582

Ich habe einfach hinzugefügt

     android:configChanges="keyboard|keyboardHidden|orientation"

in der Manifestdatei und hat nicht hinzugefügt jede onConfigurationChanged Methode in meiner Aktivität.

Jedes Mal, wenn die Tastatur heraus- oder hineingeschoben wird, passiert also nichts. .

21voto

ganesh krishnan Punkte 211

El onCreate Methode wird auch dann noch aufgerufen, wenn Sie die orientation von Android. Das Verschieben aller schweren Funktionen auf diese Methode wird Ihnen also nicht helfen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X