onConfigurationChanged wird nicht aufgerufen

141

Heute Morgen hatte ich ein Problem beim Versuch, mit dem onConfigurationChangedEreignis umzugehen. Das Problem ist, dass die Methode, die ich überschreibe, nicht aufgerufen wird, wenn ich die Ausrichtung des Telefons ändere. Überhaupt nicht angerufen zu werden.

Ich habe die android:configChanges="orientation"im Manifest definierte Aktivität wie in der Android-Dokumentation angegeben aktiviert, aber das macht keinen Unterschied.

Haben Sie sich dieses Problem ausgedacht?

lblasa
quelle
1
Ich habe das gleiche Problem für Android: configChanges = "keyboardHidden" - onConfigurationChanged wird nicht aufgerufen, wenn die Softtastatur ein- oder ausgefahren wird.
Pieter Witvoet
keyboardHidden wird nicht von der Softwaretastatur ausgelöst, sondern nur von Hardwaretastaturen wie der Schiebetastatur des Droid.
nmr
10
Sie sollten "screenSize" hinzufügen in android:configChanges Dies ist, was der Google Javadoc sagte: Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
Ektos974
@ Ektos974 großartig! Durch Hinzufügen von screenSize wird onConfigurationChanged aufgerufen!
Manuela
Hallo, ich verwende Theme.Holo.Light.NoActionBar. In diesem Fall wird meine Aktivität neu gestartet. Gibt es eine Möglichkeit, die Aktivität zum Neustart zu vermeiden?
Manukumar

Antworten:

250

Dies war mein Gremlin für das gleiche Problem:

Achtung: 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 einen Neustart der Laufzeit aufgrund von Orientierungsänderungen bei der Entwicklung für API-Level 13 oder höher (wie durch die Attribute minSdkVersion und targetSdkVersion deklariert) verhindern möchten, müssen Sie zusätzlich zum Wert "Orientierung" den Wert "screenSize" angeben. Das heißt, Sie müssen Android dekalieren: configChanges = "Orientierung | Bildschirmgröße". Wenn Ihre Anwendung jedoch auf API-Stufe 12 oder niedriger abzielt, behandelt Ihre Aktivität diese Konfigurationsänderung immer selbst (diese Konfigurationsänderung startet Ihre Aktivität nicht neu, selbst wenn sie auf einem Android 3.2-Gerät oder höher ausgeführt wird).

(Von http://developer.android.com/guide/topics/resources/runtime-changes.html )

TL; DR: Fügen Sie configChanges "| screenSize" hinzu, wenn Sie auf API-Level 13+ abzielen

nmr
quelle
9
wow, nur ein einziges Attribut muss hinzugefügt werden und verdammt das ist alles, +1von meiner Seite war "screenSize"es.
Anuj
@philipp Was würde das Einstellen der Ausrichtung zum Sensor bewirken? Ich bin mir nicht sicher, wie das hilfreich wäre. Danke für die Bearbeitung.
nmr
4 Jahre später werden die Leute immer noch davon gebissen :)
Daniel Wilson
Vielen Dank. Verbrachte 30 Minuten damit, meinen Kopf gegen die Wand zu schlagen.
Lagos
Dies ist die perfekte Lösung
Anbarasu Chinna
40

Einige Geräte von 4.0 rufen onConfigurationChanged nicht auf. Fügen Sie einfach einen Listener zu screenSize hinzu.

android:configChanges="orientation|screenSize"
Corbella
quelle
Dies löste mein Problem. Für mein Nexus 7-Tablet reichte es nicht aus, das zu überschreiben onConfigurationChanged, zu testen Configuration.ORIENTATION_LANDSCAPEund NUR android:configChanges="orientation"in das Manifest aufzunehmen. Vielen Dank
Jantzilla
37

Das Problem war, dass, wenn Sie diese Methode verwenden

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Um die Ausrichtung Ihres ActivityModus auf Hochformat zu erzwingen , können Sie keine orientationÄnderungen erhalten .

Die Lösung besteht also darin, nicht setRequestOrientationauf einen bestimmten Modus zuzugreifen. Aber stattdessen verwendenSCREEN_ORIENTATION_SENSOR.

lblasa
quelle
5
Ja, das funktioniert, aber was ist, wenn ich nicht möchte, dass meine App gedreht wird? Ich möchte, dass es im Querformat bleibt.
stoefln
Sie müssen die <Aktivität android: name = ". MyActivity" android: screenOrientation = "Landschaft"> </ Aktivität> in Ihrer Menifest-Datei angeben
Qadir Hussain
3
Wie verwende ich dies beide (wenn der Benutzer auf einem Videoplayer auf "Vollbild" klickt) und empfange onConfigChangedauch weiterhin, wenn der Benutzer sein Telefon dreht ? Gleiches Verhalten wie in der YouTube-App. Ist das möglich?
Vucko
29

Überprüfen Sie, ob auf Ihrem Gerät die Einstellung "Bildschirmdrehung" aktiviert ist

Einstellung "Bildschirmdrehung"

Dmitry Kolesnikovich
quelle
7
Ich hatte dieses lustige Problem ...: D
Dharmendra
Ist es möglich, die Aktivität zu drehen, obwohl die Option "Bildschirmdrehung" deaktiviert ist?. Wenn JA, sagen Sie mir bitte, wie das geht ...... Nach meinem Verständnis wird es nicht funktionieren, aber einige Anwendungen drehen die Aktivität in die Landschaft.
Srinivasan
1
S ** t !!! Verbrachte 4-5 Stunden damit, meinen Code zum Laufen zu bringen! Eine Möglichkeit, dies zu überschreiben, wie ich aus einer anderen Antwort lerne, besteht darin, <android: Orientierung = "Sensor"> in das Manifest aufzunehmen
Suku
19
  1. Stellen Sie sicher, dass Sie nicht android:screenOrientationin einem Activityoder in einem ApplicationLevel verwenden.
  2. Versuchen Sie es android:configChanges="orientation|keyboardHidden"stattdessen.
Macarse
quelle
1
Wie kann ich Android: ScreenOrientation verwenden und ich möchte onConfigurationChanged Methode ausführen, was kann ich tun, thx
Bingchean
17

Ich verbrachte zehn Minuten damit, herauszufinden, warum es nicht funktionierte. Ich fügte hinzuscreenSize aber es funktionierte immer noch nicht.

Es stellte sich heraus, dass ich android:configChangesdem <application>Element hinzugefügt hatte , nicht dem<activity> Element, wie ich es hätte haben sollen!

Natürlich war das mein Fehler, aber wir alle wissen, dass wir alle viel Zeit für diese Art von albernem Fehler aufwenden. Also füge ich diese Antwort hinzu, nur für den Fall, dass es einen anderen dummen Programmierer wie mich geben sollte.

Verdammtes Gemüse
quelle
Ich mache auch das gleiche. Danke, dass du mich gerettet hast
Pranoy Sarkar
Ho Danke Kumpel!
Laurent
14

Macarse ist mit seiner 2. Option zu 100% am Geld.

Versuchen android:configChanges="orientation|keyboardHidden|screenSize"

Ich hatte genau das gleiche Problem und fügte auf dem 1.6-Emulator keyboardHiddenUrsachen hinzu onConfigurationChanged, die während der Rotation aufgerufen werden sollten. Entfernen Sie es und es wird nicht mehr aufgerufen.

Wilhelm
quelle
5

Ich hatte das gleiche Problem - onConfigurationChangedwurde nicht aufgerufen , wenn die Geräteausrichtung geändert , obwohl mit android:configChanges="orientation|keyboardHidden"in der Manifest - Datei. Ich habe den von Devahier geteilten Code verwendet

Orientierung funktioniert nicht in 2.3.3?

um zu überprüfen, ob onConfigurationChangedangerufen wurde. Es war nicht.

Nach einigen Stunden des Experimentierens stellte ich fest, dass die Manifestdatei die folgenden Zeilen enthielt

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15"/>

und beim Wechsel android:targetSdkVersion="15"zu android:targetSdkVersion="8", onConfigurationChangedwurde angerufen. Ein Teil des Manifests sah also endlich so aus

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>
aLerner
quelle
9
Das Problem, das Sie haben, ist das fehlende Attribut: Bildschirmgröße. Bitte aktualisieren Sie Ihre Antwort. Dies wird eine irreführende "Korrektur" für Anfänger andriod Entwickler sein
Tobrun
@ user1281750 Danke, aber als Anfänger für Android bin ich mir nicht sicher, was du genau sagst.
aLearner
@aLearner Ich denke, was user1281750 bedeutete: Dies ist eigentlich kein Fix! Was ist, wenn Sie eine höhere SDK-Version benötigen?
AgentKnopf
Ich teilte mit, was für mich funktionierte. Mir ist klar, dass dies möglicherweise nicht die Lösung ist. Aber was ist die Alternative? Was ist die "richtige" Lösung? Und was ist mit "vermisst attribute: screensize" gemeint ? Es kann hilfreich sein, wenn weitere Details angegeben werden.
aLearner
Danke Kumpel, diese Lösung hat meine große Spannung gelöst lol .. Ich habe eine Stunde lang gesurft, um das zu bekommen ... es funktioniert auch in allen aktualisierten Versionen
Sampath Kumar
3

Ich habe das gerade gefunden, wenn Sie haben:

android:screenOrientation="landscape"

Im Manifest wird onConfigurationChanged () nicht auch aufgerufen ...

Dies kann ähnlich sein wie:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Diese Einstellung blockiert die onConfigurationChanged ().

Nick Jian
quelle
3
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

Verwenden Sie keine Ziel-SDK-Versionen , um Komplikationen zu verursachen. Verwenden Sie dies für alle API-Ebenen als Listener für Konfigurationsänderungen

android:configChanges="orientation|keyboardHidden|screenLayout"
Sampath Kumar
quelle
3

Ich bin mir nicht sicher, ob dies der beste Ort dafür ist, aber als ich auf dieses Problem stieß, bemerkte ich etwas Interessantes.

Wenn der Listener onConfigurationChanged () NICHT funktioniert, wird onCreate () bei jeder Änderung der Ausrichtung erneut aufgerufen.

Wenn der Listener onConfigurationChanged () funktioniert, wird diese Methode anstelle von onCreate () aufgerufen, wenn sich die Ausrichtung ändert.

Gene Bo
quelle
Das sehe ich - aber ich will es nicht sein. Und laut den Dokumenten sollte es nicht so passieren. So verwirrend.
Slycrel
2

Alle Lösungen funktionieren nicht, wenn ich versuche, meine Designaktivität in der Android-Manifestdatei zu entfernen. So seltsam

<activity
        android:name="MyActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@style/MyTheme" --> remove this line
        />



<style name="MyTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>
thanhbinh84
quelle
Gibt es eine Möglichkeit, einen Neustart der Aktivität zu vermeiden, ohne windowNoTitle zu entfernen?
Manukumar
2

Keiner der Vorschläge funktionierte für mich (ich hatte ein natives Projekt mit diesem Problem reagiert), aber nach stundenlangem Debuggen stellte ich fest, dass Sie diese Zeile im AppTheme von styles.xml haben

<item name="android:windowIsTranslucent">true</item>

dann dreht sich die App nicht.

Matej Ukmar
quelle
1

@ thanhbinh84 Hat mir eine Idee gegeben, was dies verursachen könnte.
Das Entfernen <item name="android:windowIsTranslucent">true</item> von meinem Thema in styles.xml hat es behoben!

Nitsan
quelle
0

Ich hatte das gleiche Problem und ich hatte sowohl "android: screenOrientation" als auch "android: configChanges" im Manifest angegeben. Wenn ich die erste entfernt habe, wird onConfigurationChanged () bei Rotation aufgerufen. Seltsam, aber es woks)

Mischen
quelle
1
Aber wie dreht man sich dann?
Mark Molina
-2

Haben Sie android.content.res.Configurationin Ihren Importanweisungen? Eclipse kann Importe automatisch einfügen, wenn Sie drücken Ctrl+Shift+O.

Wenn dies fehlt, kann der Compiler nicht erkennen, dass Sie die Methode der Oberklasse zu Recht überschreiben, und gibt daher einen Fehler aus.

Mark Mooibroek
quelle
Ja, der Import ist bereits vorhanden, irgendwelche Ideen? weil ich keinen Fehler oder irgendetwas bekomme, wird es nur nicht aufgerufen.
lblasa
Ich weiß nicht, ob dies damit zusammenhängen könnte, dass die gesamte Anwendung im Hochformat erfolgt. Die Aktivität, in der ich das onConfigurationChangedEvent verarbeiten muss, ist eine Aktivität, die in einem TabHost enthalten ist. Dieser Modus ist Hochformat. Trotzdem habe ich keine Kommentare dazu gefunden, dass dies ein Problem für das Abfangen dieses Ereignisses ist. Ich habe wirklich keine Ideen mehr.
lblasa