onConfigurationChanged ne se fait pas appeler

141

Ce matin, j'ai rencontré un problème en essayant de gérer l' onConfigurationChangedévénement. Le problème est que la méthode, que je remplace, n'est pas appelée lorsque je change l'orientation du téléphone. Ne pas être appelé du tout.

J'ai mis android:configChanges="orientation"sur l'activité définie dans le manifeste comme mentionné sur la documentation Android, mais cela ne fait aucune différence.

Avez-vous rencontré ce problème?

lblasa
la source
1
J'ai le même problème pour Android: configChanges = "keyboardHidden" - onConfigurationChanged n'est pas appelé lorsque le clavier virtuel glisse vers l'intérieur ou l'extérieur.
Pieter Witvoet
keyboardHidden n'est pas déclenché par le clavier logiciel, mais uniquement par des claviers matériels, comme le clavier coulissant du Droid.
nmr
10
Vous devez ajouter "screenSize" dans android:configChanges Voici ce que le javadoc google a dit: 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 super! l'ajout de screenSize permet d'appeler onConfigurationChanged!
Manuela
Bonjour, j'utilise le thème Theme.Holo.Light.NoActionBar. Pour celui-ci, mon activité redémarre. Existe-t-il un moyen d'éviter l'activité pour redémarrer?
Manukumar

Réponses:

250

C'était mon gremlin pour le ~ même problème:

Attention: à partir d'Android 3.2 (niveau d'API 13), la «taille de l'écran» change également lorsque l'appareil bascule entre l'orientation portrait et paysage. Ainsi, si vous souhaitez empêcher le redémarrage de l'exécution en raison d'un changement d'orientation lors du développement pour le niveau d'API 13 ou supérieur (comme déclaré par les attributs minSdkVersion et targetSdkVersion), vous devez inclure la valeur "screenSize" en plus de la valeur "orientation". Autrement dit, vous devez decalare android: configChanges = "orientation | screenSize". Cependant, si votre application cible le niveau d'API 12 ou inférieur, votre activité gère toujours cette modification de configuration elle-même (cette modification de configuration ne redémarre pas votre activité, même lorsqu'elle est exécutée sur un appareil Android 3.2 ou supérieur).

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

TL; DR: ajoutez "| screenSize" à configChanges lorsque vous ciblez le niveau d'API 13+

RMN
la source
9
wow, juste un seul attribut à ajouter et putain c'est tout, +1de mon côté "screenSize"c'était.
Anuj le
@philipp Que serait le réglage de l'orientation du capteur? Je ne sais pas comment cela serait utile. Merci pour la modification.
nmr
4 ans plus tard, les gens se font encore piquer :)
Daniel Wilson
Merci. J'ai passé 30 minutes à me frapper la tête contre le mur.
lagos le
C'est la solution parfaite
Anbarasu Chinna
40

Certains appareils de 4.0 n'appellent pas onConfigurationChanged. Ajoutez simplement un auditeur à screenSize.

android:configChanges="orientation|screenSize"
Corbella
la source
Cela a résolu mon problème. Remplacer onConfigurationChanged, tester Configuration.ORIENTATION_LANDSCAPEet inclure UNIQUEMENT android:configChanges="orientation"dans le manifeste n'était pas suffisant pour ma tablette Nexus 7. Merci
Jantzilla
37

Le problème était que si vous utilisez cette méthode

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

pour forcer l'orientation de votre Activityen mode portrait, vous n'êtes pas candidat pour recevoir des orientationmodifications.

La solution est donc de ne pas setRequestOrientationutiliser un mode particulier. Mais utilisez plutôtSCREEN_ORIENTATION_SENSOR.

lblasa
la source
5
oui, cela fonctionne, mais que faire si je ne veux pas que mon application soit tournée? je veux qu'il reste en mode paysage.
stoefln
vous devez spécifier <activity android: name = ". MyActivity" android: screenOrientation = "landscape"> </activity> dans votre fichier menifest
Qadir Hussain
3
Comment puis-je utiliser à la fois cela (lorsque l'utilisateur clique sur "plein écran" sur un lecteur vidéo), ET continuer à recevoir onConfigChangedaussi, lorsque l'utilisateur fait pivoter son téléphone. Même comportement que dans l'application youtube. C'est possible?
Vucko
29

vérifiez que le paramètre "Rotation de l'écran" est activé sur votre appareil

Paramètre "Rotation de l'écran"

Dmitry Kolesnikovich
la source
7
J'ai eu ce drôle de problème ...: D
Dharmendra
Est-il possible de faire pivoter l'activité même si l'option "Rotation de l'écran" est désactivée?. Si OUI, dites-moi comment faire cela ......? Selon ma compréhension, cela ne fonctionnera pas, mais certaines applications font pivoter l'activité en paysage.
Srinivasan
1
S ** t !!! J'ai passé 4 à 5 heures à essayer de faire fonctionner mon code! Une façon de contourner ce problème, comme l’apprend une autre réponse, consiste à inclure <android: orientation = "sensor"> dans le manifeste
suku
19
  1. Vérifiez que vous n'utilisez pas android:screenOrientationdans un Activityou dans un Applicationniveau.
  2. Essayez d'utiliser à la android:configChanges="orientation|keyboardHidden"place.
Macarse
la source
1
comment puis-je utiliser Android: screenOrientation et je veux exécuter la méthode onConfigurationChanged, que puis-je faire,
merci
17

J'ai passé des dizaines de minutes à découvrir pourquoi cela ne fonctionnait pas. J'ai ajoutéscreenSize mais cela ne fonctionnait toujours pas.

Il s'est avéré que j'avais ajouté android:configChangesà l' <application>élément, pas à la<activity> élément comme j'aurais dû!

Eh bien, bien sûr, c'était mon erreur, mais nous savons tous que nous passons tous beaucoup de temps pour ce genre d'erreur stupide. Donc, j'ajoute cette réponse juste au cas où il y aurait un autre programmeur idiot comme moi.

Légumes maudits
la source
Je fais aussi la même chose, merci de m'avoir sauvé
Pranoy Sarkar
Ho merci mec!
Laurent
14

Macarse est à 100% sur l'argent avec sa deuxième option.

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

J'ai eu exactement le même problème, et sur l'émulateur 1.6, l'ajout de keyboardHiddencauses onConfigurationChangedà appeler pendant la rotation. Retirez-le et il cesse d'être appelé.

William
la source
5

J'ai eu le même problème - onConfigurationChangedn'a pas été appelé lorsque l'appareil a changé d' orientation en dépit d' avoir android:configChanges="orientation|keyboardHidden"dans le fichier manifeste. J'ai utilisé l'extrait de code partagé par Devaici

l'orientation ne fonctionne pas dans 2.3.3?

pour vérifier si onConfigurationChangeda été appelé. Ce n'était pas.

Après quelques heures d'expérimentation, j'ai réalisé que j'avais les lignes suivantes dans le fichier manifeste

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

et lors du passage android:targetSdkVersion="15"à android:targetSdkVersion="8", a onConfigurationChangedcommencé à être appelé. Donc, une partie du manifeste ressemblait finalement à ceci

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>
aLearner
la source
9
Le problème que vous rencontrez est l'attribut manquant: la taille de l'écran. Veuillez mettre à jour votre réponse. Ce sera un "correctif" trompeur pour les développeurs andriod débutants
Tobrun
@ user1281750 Merci, mais en tant que développeur Android débutant, je ne suis pas sûr de ce que vous dites exactement.
aLearner
@aLearner Je pense ce que veut dire user1281750: ce n'est pas vraiment une solution! Et si vous avez besoin d'une version SDK supérieure?
AgentKnopf
J'ai partagé ce qui a fonctionné pour moi. Je me rends compte que ce n'est peut-être pas «la» solution. Mais quelle est l'alternative? Quelle est la «bonne» solution? Et qu'entend-on par «manquant attribute: screensize»? Il peut être utile de fournir plus de détails.
aLearner le
Merci mon pote, cette solution a résolu ma grosse tension lol .. J'ai surfé pendant une heure pour l'obtenir ... cela fonctionne également dans toutes les versions mises à jour
Sampath Kumar
3

Je viens de découvrir que si vous avez:

android:screenOrientation="landscape"

dans le manifeste, onConfigurationChanged () ne sera pas appelé aussi ...

cela peut ressembler à:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

cette orientation de réglage bloque le onConfigurationChanged ().

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

N'utiliser toutes les versions sdk cible pour vous faire des complications. et pour tous les niveaux d'API, utilisez ceci comme écouteur de changement de configuration

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

Je ne suis pas sûr que ce soit le meilleur endroit pour cela, mais en rencontrant ce problème, j'ai observé quelque chose d'intéressant.

Si l' écouteur onConfigurationChanged () ne fonctionne PAS, alors onCreate () est appelé à nouveau chaque fois que l'orientation est modifiée.

Si l' écouteur onConfigurationChanged () fonctionne, cette méthode est appelée à la place de onCreate () lorsque l'orientation change.

Gene Bo
la source
C'est ce que je vois - mais je ne veux pas être. Et selon la documentation, cela ne devrait pas se produire de cette façon. Si confus.
slycrel
2

Toutes les solutions ne fonctionnent pas car j'essaie de supprimer mon activité de thème dans le fichier manifeste Android. Si étrange

<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
la source
Existe-t-il un moyen d'éviter que l'activité redémarre sans supprimer windowNoTitle?
Manukumar
2

Aucune des suggestions n'a fonctionné pour moi (j'avais réagi au projet natif avec ce problème), mais après des heures de débogage, j'ai trouvé que si vous avez cette ligne dans l'AppTheme de styles.xml

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

alors l'application ne tournera pas.

Matej Ukmar
la source
1

@ thanhbinh84 M'a donné une idée de ce qui pouvait en être la cause.
La suppression <item name="android:windowIsTranslucent">true</item> de mon thème dans styles.xml l'a corrigé!

Nitsan
la source
0

J'ai eu le même problème et j'avais à la fois "android: screenOrientation" et "android: configChanges" spécifiés dans le manifeste. Quand j'ai supprimé le premier, onConfigurationChanged () est appelé lors de la rotation. Étrange mais ça woks)

Mélanger
la source
1
Mais comment faites-vous une rotation alors?
Mark Molina
-2

Avez-vous android.content.res.Configurationdans vos déclarations d'importation? Eclipse peut insérer des importations automatiquement si vous appuyez sur Ctrl+Shift+O.

Si cela manque, le compilateur ne pourra pas reconnaître que vous remplacez légitimement la méthode de la superclasse et lèvera donc une erreur.

Mark Mooibroek
la source
Oui, l'importation est déjà en place, des idées? parce que je n'obtiens aucune erreur ou quoi que ce soit, c'est juste que ce n'est pas appelé
lblasa
Je ne sais pas si cela pourrait être lié au fait que toute l'application se fait en mode portrait. L'activité dans laquelle j'ai besoin de gérer le onConfigurationChangedEvent est une activité contenue dans un TabHost dont le mode est portrait. Mais de toute façon, je n'ai trouvé aucun commentaire sur ce problème pour attraper cet événement. Je suis vraiment à court d'idées.
lblasa