Ich habe gerade eine Orientierungsänderungsfunktion implementiert - z. B. wenn sich das Layout von Hochformat zu Querformat ändert (oder umgekehrt). Wie kann ich erkennen, wann das Orientierungsänderungsereignis beendet ist?
Das OrientationEventListener
hat nicht funktioniert. Wie kann ich Benachrichtigungen über Ereignisse zur Änderung der Layoutausrichtung erhalten?
Antworten:
Verwenden Sie die Aktivitätsmethode onConfigurationChanged . Siehe folgenden Code:
Sie müssen auch die entsprechenden bearbeiten Element in Ihrer Manifest-Datei, um das Android einzuschließen: configChanges Siehe den folgenden Code:
HINWEIS: Bei Android 3.2 (API-Stufe 13) oder höher ändert sich auch die "Bildschirmgröße", wenn das Gerät zwischen Hoch- und Querformat wechselt. Wenn Sie also einen Neustart der Laufzeit aufgrund von Orientierungsänderungen bei der Entwicklung für API-Level 13 oder höher verhindern möchten, müssen Sie android: configChanges = "Ausrichtung | screenSize" für API-Level 13 oder höher deklarieren .
Hoffe das wird dir helfen ... :)
quelle
Um das Layout in den Ordner layout-land zu laden , müssen Sie zwei separate Layouts haben, die Sie
setContentView
in deronConfigurationChanged
Methode erstellen müssen .Wenn Sie nur ein Layout haben, ist es nicht erforderlich, setContentView in dieser Methode zu erstellen. einfach
quelle
onConfigurationChanged(Configuration newConfig)
Methode implementiert (wie in dieser Antwort), aber anstatt sie selbst zu behandeln, habe ich ein Boolesches Flag gesetzt und dierecreate()
Methode dann aufgerufen , damit Android die Aktivität auf normale Weise neu erstellt.recreate()
Methode besteht darin, dass der Bildschirm kurz schwarz blinkt. Aus diesem Grund habe ich einen anderen Ansatz gewählt: (1) Speichern der Bildschirmbreite inonCreate(...)
, (2) Vergleichen der gespeicherten Bildschirmbreite mit der aktuellen Bildschirmbreite in einer beliebigen Lebenszyklusmethode, wenn die Aktivität beendet wird (zonSaveInstanceState(...)
. B. ).Ich wollte Ihnen nur einen Weg zeigen, wie Sie Ihr gesamtes Bundle nach onConfigurationChanged speichern können:
Erstelle direkt nach deiner Klasse ein neues Bundle:
Als nächstes fügen Sie nach "protected void onCreate" Folgendes hinzu:
Wenn Sie dies hinzufügen, werden alle Ihre Klassen in MainActivity gespeichert.
Am besten fügen Sie dies jedoch in Ihr AndroidManifest ein:
quelle
onConfigurationChanged()
wird Ihr instanceState nicht zerstört, wenn sich die Ausrichtung ändert, sodass Sie ihn nicht speichern müssen. Möglicherweise möchten Sie es für andere Ereignisse im Aktivitätslebenszyklus speichern, aber ich weiß es nicht.Verwenden Sie diese Methode
Und vergessen Sie nicht, dies in Ihre Androidmainfest.xml aufzunehmen
so was
quelle
Überschreiben Sie die Aktivitätsmethode onConfigurationChanged
quelle
Ich möchte nur eine andere Alternative vorschlagen, die einige von Ihnen betrifft, wie oben erläutert:
impliziert, dass wir das zu injizierende Layout explizit deklarieren.
Für den Fall, dass wir die automatische Injektion dank der Layout-Land- und Layout-Ordner beibehalten möchten. Alles was Sie tun müssen, ist es zu onCreate hinzuzufügen:
Hier wird die Aktionsleiste je nach Ausrichtung des Telefons angezeigt oder nicht
quelle
Erstellen Sie eine
OrientationEventListener
Klasseninstanz und aktivieren Sie sie.quelle
Wenn die akzeptierte Antwort für Sie nicht funktioniert, stellen Sie sicher, dass Sie sie nicht in der Manifestdatei definiert haben:
Welches ist mein Fall.
quelle
Für den Fall, dass dies für einige neuere Entwickler von Nutzen ist, da es oben nicht angegeben ist. Nur um ganz explizit zu sein:
Sie benötigen zwei Dinge, wenn Sie onConfigurationChanged verwenden :
Eine
onConfigurationChanged
Methode in Ihrer AktivitätsklasseGeben Sie in Ihrem Manifest an, welche Konfigurationsänderungen von Ihrer
onConfigurationChanged
Methode behandelt werdenDas Manifest-Snippet in den obigen Antworten ist zwar zweifellos für die jeweilige App, zu der das Manifest gehört, korrekt, aber NICHT genau das, was Sie in Ihr Manifest einfügen müssen, um die onConfigurationChanged-Methode in Ihrer Aktivitätsklasse auszulösen. Das heißt, der folgende Manifesteintrag ist möglicherweise nicht korrekt für Ihre App.
Im obigen Manifesteintrag gibt es verschiedene Android-Aktionen, für
android:configChanges=""
die onCreate in Ihrem Aktivitätslebenszyklus ausgelöst werden kann.Dies ist sehr wichtig - Diejenigen, die NICHT im Manifest angegeben sind, lösen Ihr onCreate aus, und diejenigen, die im Manifest angegeben sind, lösen Ihre
onConfigurationChanged
Methode in Ihrer Aktivitätsklasse aus.Sie müssen also ermitteln, welche Konfigurationsänderungen Sie selbst vornehmen müssen. Für Android Encyclopedically Challenged wie mich habe ich das Popup mit schnellen Hinweisen in Android Studio verwendet und fast jede mögliche Konfigurationsoption hinzugefügt. Das Auflisten all dieser Elemente hat im Grunde gesagt, dass ich alles erledigen würde und onCreate aufgrund von Konfigurationen niemals aufgerufen wird.
Jetzt möchte ich natürlich nicht alles erledigen, also habe ich begonnen, die oben genannten Optionen einzeln zu eliminieren. Nach jedem Entfernen meine App neu erstellen und testen.
Ein weiterer wichtiger Punkt : Wenn nur eine Konfigurationsoption automatisch behandelt wird, die Ihr onCreate auslöst (Sie haben es oben in Ihrem Manifest nicht aufgeführt), scheint
onConfigurationChanged
es nicht zu funktionieren. Sie müssen alle relevanten in Ihr Manifest aufnehmen.Am Ende hatte ich 3, die ursprünglich onCreate auslösten, dann habe ich auf einem S10 + getestet und ich bekam immer noch onCreate, also musste ich meine Eliminierungsübung erneut machen und ich brauchte auch das
|screenSize
. Testen Sie also auf einer Auswahl von Plattformen.Also mein Vorschlag, obwohl ich sicher bin, dass jemand Löcher in diese stechen kann:
Fügen Sie Ihre
onConfigurationChanged
Methode in Ihrer Aktivitätsklasse mit einem TOAST oder LOG hinzu, damit Sie sehen können, wann sie funktioniert.Fügen Sie Ihrem Manifest alle möglichen Konfigurationsoptionen hinzu.
Bestätigen Sie, dass Ihre
onConfigurationChanged
Methode funktioniert, indem Sie Ihre App testen.Entfernen Sie jede Konfigurationsoption einzeln aus Ihrer Manifestdatei und testen Sie anschließend Ihre App.
Testen Sie auf möglichst vielen Geräten.
Kopieren Sie meinen obigen Ausschnitt nicht in Ihre Manifestdatei. Android-Updates ändern die Liste. Verwenden Sie daher die Pop-out-Hinweise für Android Studio, um sicherzustellen, dass Sie alle erhalten.
Ich hoffe das spart jemandem etwas Zeit.
Meine
onConfigurationChanged
Methode nur zur Info unten.onConfigurationChanged
wird im Lebenszyklus aufgerufen, nachdem die neue Ausrichtung verfügbar ist, aber bevor die Benutzeroberfläche neu erstellt wurde. Daherif
funktioniert meine erste Überprüfung der Ausrichtung korrekt, und die zweite, die verschachtelt istif
, um die Sichtbarkeit meiner UI ImageView zu überprüfen, funktioniert ebenfalls korrekt.quelle
Für die Kotilin-Implementierung in der einfachsten Form - wird nur ausgelöst, wenn sich der Bildschirm von Hoch- zu Querformat ändert, wenn das Gerät eine Flip-Erkennung (180 Grad) benötigt, müssen Sie die Werte des Schwerkraftsensors eingeben
quelle