Wenn ich in meiner Android-Anwendung das Gerät Activity
drehe ( die Tastatur herausziehe), wird my neu gestartet ( onCreate
heißt). Nun, das ist wahrscheinlich so, wie es sein soll, aber ich mache viele anfängliche Einstellungen in der onCreate
Methode, also brauche ich entweder:
- Stellen Sie alle anfänglichen Einstellungen in eine andere Funktion, damit bei der Gerätedrehung oder nicht alles verloren geht
- Machen Sie es so
onCreate
wird nicht nochmal aufgerufen und das Layout passt sich einfach an oder - Beschränken Sie die App auf nur Porträt, damit sie
onCreate
nicht aufgerufen wird.
android
rotation
android-activity
Isaac Waller
quelle
quelle
Antworten:
Verwenden der Anwendungsklasse
Abhängig davon, was Sie in Ihrer Initialisierung tun, können Sie eine neue Klasse erstellen, die
Application
Ihren Initialisierungscode erweitert und in eine überschriebeneonCreate
Methode innerhalb dieser Klasse verschiebt.Die
onCreate
in der Anwendungsklasse wird nur aufgerufen, wenn die gesamte Anwendung erstellt wurde, sodass die Aktivität bei Ausrichtung neu gestartet wird oder Änderungen der Tastatursichtbarkeit sie nicht auslösen.Es wird empfohlen, die Instanz dieser Klasse als Singleton verfügbar zu machen und die Anwendungsvariablen, die Sie initialisieren, mithilfe von Gettern und Setzern verfügbar zu machen.
HINWEIS: Sie müssen den Namen Ihrer neuen Anwendungsklasse im Manifest angeben, damit sie registriert und verwendet werden kann:
Reagieren auf Konfigurationsänderungen [UPDATE: Dies ist seit API 13 veraltet. siehe die empfohlene Alternative ]
Als weitere Alternative können Sie Ihre Anwendung auf Ereignisse warten lassen, die einen Neustart verursachen würden - wie z. B. Änderungen der Ausrichtung und der Sichtbarkeit der Tastatur - und diese in Ihrer Aktivität behandeln.
Fügen Sie zunächst den
android:configChanges
Knoten zum Manifestknoten Ihrer Aktivität hinzuoder für Android 3.2 (API Level 13) und neuer :
Überschreiben Sie dann innerhalb der Aktivität die
onConfigurationChanged
Methode und rufen SiesetContentView
auf, um zu erzwingen, dass das GUI-Layout in der neuen Ausrichtung erneut ausgeführt wird.quelle
android:configChanges
) sollte vermieden und nur als letzter Ausweg verwendet werden. Weitere Informationen zur ordnungsgemäßen Behandlung eines Neustarts aufgrund einer Konfigurationsänderung finden Sie unter Behandeln von Laufzeitänderungen. Stattdessen scheinen sie es vorzuziehen, die Daten über Rotationsereignisse hinweg zu verwendenonSaveInstanceState Bundle
. oder wie @ Jon-O erwähnt ,onRetainNonConfigurationInstance
.onRetainNonConfigurationChanges
ist fehlertoleranter und unkomplizierter.Update für Android 3.2 und höher:
quelle
Fragments
undsetRetainInstance
.screenSize
für Android 3.2 und höher, der mein Problem gelöst hat. Danke!Anstatt zu verhindern,
onCreate()
dassBundle
savedInstanceState
das Ereignis vollständig ausgelöst wird, überprüfen Sie möglicherweise, ob das Ereignis an das Ereignis übergeben wird, um festzustellen, ob es null ist oder nicht.Wenn ich zum Beispiel eine Logik habe, die ausgeführt werden soll, wenn die
Activity
wirklich erstellt wird, und nicht bei jeder Orientierungsänderung, führe ich diese LogikonCreate()
nur dann aus, wenn diesavedInstanceState
Null ist.Ansonsten möchte ich immer noch, dass das Layout für die Ausrichtung richtig neu gezeichnet wird.
Ich bin mir nicht sicher, ob dies die ultimative Antwort ist, aber es funktioniert für mich.
quelle
Intent serverintent = new Intent(MainActivity.this, MessageListener.class);
undstartService(serverintent);
einserverSocket = new ServerSocket(0xcff2);
undSocket client = serverSocket.accept();
mit einem zu erstellenBufferedReader(new InputStreamReader(client.getInputStream()));
und konnte mein Android drehen und die Client / Server-Verbindung aktiv halten, aber die GUI drehen lassen. Laut Handbuch wird savedInstanceState beim Herunterfahren der letzten Aktivität initialisiert.Was ich getan habe...
im Manifest zum Aktivitätsabschnitt hinzugefügt:
im Code für die Aktivität implementiert:
quelle
Was Sie beschreiben, ist das Standardverhalten. Sie müssen diese Ereignisse selbst erkennen und behandeln, indem Sie Folgendes hinzufügen:
zu Ihrem Manifest und dann zu den Änderungen, die Sie behandeln möchten. Zur Orientierung würden Sie also verwenden:
und für das Öffnen oder Schließen der Tastatur würden Sie verwenden:
Wenn Sie beide verarbeiten möchten, können Sie sie einfach mit dem Pipe-Befehl wie folgt trennen.
Dadurch wird die onConfigurationChanged-Methode in jeder von Ihnen aufgerufenen Aktivität ausgelöst. Wenn Sie die Methode überschreiben, können Sie die neuen Werte übergeben.
Hoffe das hilft.
quelle
Ich habe gerade diese Überlieferung entdeckt:
Für die Aktivität am Leben durch eine Orientierungsänderung zu halten, und Umgang mit ihm durch
onConfigurationChanged
, die Dokumentation und das Codebeispiel oben deuten darauf hin , dies in der Manifest - Datei:Das hat den zusätzlichen Vorteil, dass es immer funktioniert.
Die Bonusüberlieferung ist, dass das Weglassen des
keyboardHidden
logisch erscheint, aber zu Fehlern im Emulator führt (zumindest für Android 2.1): Wenn Sie nurorientation
angeben, wird der Emulator sowohlOnCreate
als auchonConfigurationChanged
manchmal und nur zuOnCreate
anderen Zeiten aufgerufen .Ich habe den Fehler auf einem Gerät nicht gesehen, aber ich habe gehört, dass der Emulator für andere fehlerhaft ist. Es lohnt sich also zu dokumentieren.
quelle
Fragments
undsetRetainInstance
.Sie können auch die Methode der Android-Plattform verwenden, um Daten über Orientierungsänderungen hinweg beizubehalten:
onRetainNonConfigurationInstance()
undgetLastNonConfigurationInstance()
.Auf diese Weise können Sie Daten über Konfigurationsänderungen hinweg beibehalten, z. B. Informationen, die Sie möglicherweise von einem Serverabruf erhalten haben, oder etwas anderes, das in
onCreate
oder seitdem berechnet wurde , und gleichzeitig Android die Möglichkeit geben, dieActivity
Verwendung der XML-Datei für die jetzt verwendete Ausrichtung neu zu gestalten .Siehe hier oder hier .
Es sollte beachtet werden , dass diese Methoden jetzt veraltet sind (obwohl noch flexibler als sich Orientierungsänderung Handhabung , da die meisten der oben genannten Lösungen vorschlagen) mit der Empfehlung , dass jeder Schalter auf
Fragments
und verwenden Sie stattdessensetRetainInstance(true)
auf jedemFragment
Sie behalten möchten.quelle
Der Ansatz ist nützlich, bei Verwendung von Fragmenten jedoch unvollständig.
Fragmente werden normalerweise bei Konfigurationsänderungen neu erstellt. Wenn Sie dies nicht möchten, verwenden Sie
setRetainInstance(true);
in den Konstruktoren des FragmentsDadurch bleiben Fragmente während der Konfigurationsänderung erhalten.
http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
quelle
setRetainInstance()
Methode @Abdo erwähnt.Ich habe es einfach hinzugefügt
in der Manifest-Datei und hat keine
onConfigurationChanged
Methode in meiner Aktivität hinzugefügt .Jedes Mal, wenn die Tastatur heraus- oder hineingleitet, passiert nichts .
quelle
<application ...android:configChanges="keyboard|keyboardHidden|orientation">
und es funktioniert. Meine Einstellungen in build.gradle:minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2"
Die
onCreate
Methode wird auch dann noch aufgerufen, wenn Sie dieorientation
von Android ändern . Wenn Sie also alle umfangreichen Funktionen auf diese Methode umstellen, hilft Ihnen dies nicht weiterquelle
Fügen Sie den folgenden Code in Ihr
<activity>
Tag einManifest.xml
:quelle
Welcher Teil des Manifests sagt "nicht anrufen
onCreate()
"?Auch Google docs sagen Verwendung zu vermeiden
android:configChanges
(außer als letztes Mittel ) .... Aber dann die alternativen Methoden , die sie vorschlagen , alle DO Einsatzandroid:configChanges
.Ich habe die Erfahrung gemacht, dass der Emulator IMMER die
onCreate()
Rotation aufruft .Aber die 1-2 Geräte, auf denen ich den gleichen Code ausführe ... nicht. (Ich bin mir nicht sicher, warum es einen Unterschied geben würde.)
quelle
Es ist sehr einfach, machen Sie einfach die folgenden Schritte:
Das funktioniert bei mir:
Hinweis: Die Ausrichtung hängt von Ihrer Anforderung ab
quelle
Änderungen, die im Android-Manifest vorgenommen werden müssen, sind:
Ergänzungen innerhalb der Aktivität sind:
quelle
Fügen Sie diese Zeile zu Ihrem Manifest hinzu: -
und dieser Ausschnitt zur Aktivität: -
quelle
Es gibt verschiedene Möglichkeiten, dies zu tun:
Aktivitätsstatus speichern
Sie können den Aktivitätsstatus in speichern
onSaveInstanceState
.und verwenden Sie dann die
bundle
, um den Status wiederherzustellen.Behandeln Sie Orientierungsänderungen selbst
Eine andere Alternative besteht darin, die Orientierungsänderungen selbst vorzunehmen. Dies wird jedoch nicht als gute Praxis angesehen.
Fügen Sie dies Ihrer Manifestdatei hinzu.
für Android 3.2 und höher:
Drehung einschränken
Sie können Ihre Aktivität auch auf den Hoch- oder Querformatmodus beschränken, um eine Drehung zu vermeiden.
Fügen Sie dies dem Aktivitäts-Tag in Ihrer Manifest-Datei hinzu:
Oder implementieren Sie dies programmgesteuert in Ihrer Aktivität:
quelle
Die Art und Weise, wie ich dies gefunden habe, besteht darin, die
onRestoreInstanceState
und dieonSaveInstanceState
Ereignisse zu verwenden, um etwas in der zu speichernBundle
(auch wenn Sie keine gespeicherten Variablen benötigen , fügen Sie einfach etwas dort ein, damit dasBundle
nicht leer ist).onCreate
Überprüfen Sie dann auf der Methode, ob dasBundle
leer ist, und führen Sie die Initialisierung durch. Wenn nicht, führen Sie die Initialisierung durch.quelle
Auch wenn es nicht "der Android-Weg" ist, habe ich sehr gute Ergebnisse erzielt, indem ich Orientierungsänderungen selbst vorgenommen und die Widgets einfach in einer Ansicht neu positioniert habe, um die geänderte Orientierung zu berücksichtigen. Dies ist schneller als jeder andere Ansatz, da Ihre Ansichten nicht gespeichert und wiederhergestellt werden müssen. Es bietet dem Benutzer auch eine nahtlosere Benutzererfahrung, da die neu positionierten Widgets genau dieselben Widgets sind, die nur verschoben und / oder in der Größe geändert wurden. Auf diese Weise kann nicht nur der Modellstatus, sondern auch der Ansichtsstatus beibehalten werden.
RelativeLayout
kann manchmal eine gute Wahl für eine Ansicht sein, die sich von Zeit zu Zeit neu orientieren muss. Sie geben lediglich eine Reihe von Hochformat-Layout-Parametern und eine Reihe von Landschafts-Layout-Parametern mit jeweils unterschiedlichen relativen Positionierungsregeln für jedes untergeordnete Widget an. Dann übergeben Sie in IhreronConfigurationChanged()
Methode die entsprechende an einensetLayoutParams()
Anruf für jedes Kind. Wenn eine untergeordnete Steuerung selbst intern neu ausgerichtet werden muss, rufen Sie einfach eine Methode für dieses untergeordnete Element auf, um die Neuausrichtung durchzuführen. Das Kind in ähnlicher Weise ruft Methoden auf eines seiner untergeordneten Steuerelemente , die interne Neuausrichtung benötigen, und so weiter.quelle
Jedes Mal, wenn der Bildschirm gedreht wird, wird die geöffnete Aktivität beendet und onCreate () wird erneut aufgerufen.
1. Sie können eine Aktion ausführen, um den Aktivitätsstatus zu speichern, wenn der Bildschirm gedreht wird, sodass Sie alle alten Inhalte wiederherstellen können, wenn die Aktivität onCreate () erneut aufgerufen wird. Verweisen Sie auf diesen Link
2. Wenn Sie einen Neustart der Aktivität verhindern möchten, fügen Sie einfach die folgenden Zeilen in Ihre Datei manifest.xml ein.
quelle
Sie müssen die onSavedInstanceState-Methode verwenden, um den gesamten Wert des Parameters is hased is bundle zu speichern
und verwenden
Um den Wert für die Anzeige von Objekten abzurufen und festzulegen, werden die Bildschirmdrehungen verarbeitet
quelle
Hinweis: Ich poste diese Antwort, wenn jemand in Zukunft das gleiche Problem wie ich hat. Für mich war die folgende Zeile nicht genug:
Beim Drehen des Bildschirms wurde die Methode `onConfigurationChanged (Configuration newConfig) nicht aufgerufen.
Lösung: Ich musste auch "screenSize" hinzufügen, auch wenn das Problem mit der Ausrichtung zu tun hatte. Fügen Sie in der Datei AndroidManifest.xml - Folgendes hinzu:
Implementieren Sie dann die Methode
onConfigurationChanged(Configuration newConfig)
quelle
Fügen Sie im Aktivitätsbereich von
manifest
Folgendes hinzu:quelle
Fügen Sie diese Zeile im Manifest hinzu:
android:configChanges="orientation|screenSize"
quelle
Die Leute sagen, dass Sie verwenden sollten
Die beste und professionellste Möglichkeit, mit Rotation in Android umzugehen, ist die Verwendung der Loader-Klasse. Es ist keine berühmte Klasse (ich weiß nicht warum), aber es ist viel besser als die AsyncTask. Weitere Informationen finden Sie in den Android-Tutorials in den Android-Kursen von Udacity.
Als andere Möglichkeit können Sie die Werte oder Ansichten natürlich mit onSaveInstanceState speichern und mit onRestoreInstanceState lesen. Es liegt wirklich an dir.
quelle
Nach einer Weile des Versuchs und Irrtums fand ich eine Lösung, die in den meisten Situationen meinen Bedürfnissen entspricht. Hier ist der Code:
Manifest Konfiguration:
Hauptaktivität:
Und Beispielfragment:
Kann auf Github gefunden werden .
quelle
Verwenden Sie den
orientation
Listener, um verschiedene Aufgaben mit unterschiedlicher Ausrichtung auszuführen.quelle
Geben Sie diesen Code in Ihr
Activity
In einAndroid Manifest
.Dadurch wird Ihre Aktivität nicht neu gestartet, wenn Sie die Ausrichtung ändern würden.
quelle
Korrigieren Sie die Bildschirmausrichtung (Quer- oder Hochformat) in
AndroidManifest.xml
android:screenOrientation="portrait"
oderandroid:screenOrientation="landscape"
dafür wird deine
onResume()
Methode nicht aufgerufen.quelle
Eine der besten Komponenten der von Google eingeführten Android-Architektur erfüllt alle Anforderungen von ViewModel.
Damit sollen UI-bezogene Daten im Lebenszyklus gespeichert und verwaltet werden. Außerdem können Daten überleben, wenn sich der Bildschirm dreht
Bitte beachten Sie dies: https://developer.android.com/topic/libraries/architecture/viewmodel
quelle
Sie können das ViewModel-Objekt in Ihrer Aktivität verwenden.
ViewModel-Objekte werden bei Konfigurationsänderungen automatisch beibehalten, sodass die darin enthaltenen Daten sofort für die nächste Aktivität oder Fragmentinstanz verfügbar sind. Weiterlesen:
https://developer.android.com/topic/libraries/architecture/viewmodel
quelle