304 votes

Comment désactiver le changement d'orientation sur Android ?

J'ai une application que je voudrais simplement utiliser en mode portrait, j'ai donc défini Android:screenOrientation="portrait" dans le manifeste XML. Cela fonctionne bien pour l'application HTC Magic (et empêche les changements d'orientation sur d'autres téléphones également).

Mais j'ai un problème avec le HTC G1 téléphone pendant que j'ouvre le matériel Clavier QWERTY (pas le clavier virtuel). Mon activité reste en mode portrait, mais elle semble être redémarrée et perd tous ses états. Cela ne se produit pas avec le HTC Hero version.

Mon application est assez volumineuse, je ne veux donc pas qu'elle redémarre et perde tous ses états à l'ouverture du clavier. Comment puis-je éviter cela ?

2 votes

Essayez aussi de regarder ici : stackoverflow.com/questions/2366706/

332voto

Intrications Points 8182

Mise à jour avril 2013 : Ne faites pas ça. Ce n'était pas une bonne idée en 2009 lorsque j'ai répondu à la question pour la première fois et ce n'est vraiment pas une bonne idée maintenant. Voir cette réponse de hackbod pour les raisons :

Éviter de recharger l'activité avec asynctask lors d'un changement d'orientation dans Android

Ajouter android:configChanges="keyboardHidden|orientation" à votre AndroidManifest.xml. Cela indique au système les changements de configuration que vous allez gérer vous-même - dans ce cas, en ne faisant rien.

<activity android:name="MainActivity"
     android:screenOrientation="portrait"
     android:configChanges="keyboardHidden|orientation">

Voir la référence du développeur configChanges pour plus de détails.

Cependant, votre application peut être interrompue à tout moment, par exemple par un appel téléphonique, et vous devez donc vraiment ajouter du code pour sauvegarder l'état de votre application lorsqu'elle est en pause.

Mise à jour : À partir d'Android 3.2, vous devez également ajouter "screenSize" :

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

Extrait du guide du développeur Gérer soi-même le changement de configuration

Attention : À partir d'Android 3.2 (niveau 13 de l'API), la " taille de l'écran " change également lorsque l'appareil passe du mode portrait au mode paysage. change également lorsque l'appareil passe de l'orientation portrait à l'orientation paysage. paysage. Par conséquent, si vous voulez éviter les redémarrages de l'exécution dus à un changement d'orientation lorsque vous développez pour le niveau API 13 ou plus (comme supérieur (tel que déclaré par les attributs minSdkVersion et targetSdkVersion), vous devez inclure la valeur "screenSize" en plus de la valeur "orientation". en plus de la valeur "orientation". Autrement dit, vous devez déclarer android:configChanges="orientation|screenSize" . Cependant, si votre application vise le niveau 12 de l'API ou un niveau inférieur, alors votre activité ce changement de configuration elle-même (ce changement de configuration configuration ne redémarre pas votre activité, même si elle fonctionne sur un appareil Android 3.2 ou plus. supérieur).

38 votes

Juste pour ajouter à cela et être vraiment explicite, Android peut tuer impitoyablement votre application à tout moment, indépendamment des changements d'orientation, donc vous devez utiliser onPause() et onSaveInstanceState() pour sauvegarder l'état, quoi qu'il arrive.

0 votes

La mise à jour 3.2 a été très utile et c'est ce qui me bloquait. Je n'avais aucune idée de la raison pour laquelle mon gestionnaire onConfigurationChanged ne se déclenchait pas et c'était le cas. Merci !

0 votes

Le troisième paramètre - screenSize est introuvable dans la version 2.3.x, dois-je le remplacer par screenLayout ?

100voto

ubershmekel Points 2254

Vous devez modifier le fichier AndroidManifest.xml comme suit Intrications (précédemment Ashton) et assurez-vous que l'activité gère l'événement onConfigurationChanged comme vous le souhaitez. Voici à quoi cela devrait ressembler :

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

0 votes

Comme l'a fait remarquer Dmitry Zaitsev, il est préférable de mettre les setRequestedOrientation() sur onCreate() .

3 votes

N'est pas onConfigurationChanged() sont appelés avant onCreate() si c'est le cas, définir l'orientation avant de définir les contentViews dans oncreate est meilleur approche, mettre la configuration à sa place est aussi nettoyant donc cette réponse est toujours valable.

41voto

m00sey Points 339

J'ai toujours trouvé que vous aviez besoin des deux

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"

23voto

Dmitry Zaitsev Points 7119

Comme on l'a dit, le jeu android:configChanges de votre activité (dans le fichier manifeste) à keyboardHidden|orientation et ensuite :

1) Annulation onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

2) Ajoutez cette ligne au fichier de votre activité onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

C'est mieux que d'ajouter la même ligne à onConfigurationChanged Si vous n'êtes pas en mesure de le faire, votre application passera en mode portrait, puis reviendra en mode paysage (cela ne se produira qu'une seule fois, mais c'est ennuyeux).

Vous pouvez également définir android:screenOrientation="nosensor" pour votre activité (en manifeste). Mais En utilisant cette méthode, vous n'êtes pas du tout en mesure de gérer les changements d'orientation.

1 votes

Que dois-je faire si je veux éviter la recréation de l'activité lors de la rotation, mais que je souhaite permettre à l'utilisateur de verrouiller l'orientation via les paramètres du système d'exploitation ?

0 votes

@androiddeveloper c'est une question distincte, qui a déjà une réponse : stackoverflow.com/a/14771495/926907

0 votes

Votre lien concerne la modification du contenu par moi-même lorsque la configuration change, mais je souhaite éviter la rotation de l'activité (pour qu'elle reste exactement comme elle est) dans le cas où l'utilisateur a choisi de verrouiller l'orientation via les paramètres de l'OS (disponibles sur certains appareils via les réglages rapides, dans le tiroir de notification).

21voto

MuhammadAamirALi Points 2555

Utilisez ce

    android:screenOrientation="portrait"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X