web-dev-qa-db-fra.com

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

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

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

Mon application est assez grosse, je ne veux donc pas qu'elle redémarre et que tous ses états soient perdus à l'ouverture du clavier. Comment puis-je empêcher ça?

279
Vidar Vestnes

Mise à jour avril 2013: ne le faites pas. 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 par hackbod pour des raisons:

Évitez de recharger votre activité avec un asyncte sur le changement d'orientation sous Android

Ajoutez Android:configChanges="keyboardHidden|orientation" à votre fichier 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 Référence de développeur configChanges pour plus de détails.

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

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

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

Du guide du développeur Gestion de la modification de configuration vous-même

Attention: à partir de Android 3.2 (API de niveau 13), la "taille de l'écran" change également lorsque l'appareil bascule entre l'orientation portrait et l'orientation paysage. Ainsi, si vous souhaitez empêcher les redémarrages d'exécution en raison d'un changement d'orientation lors du développement pour l'API de niveau 13 ou supérieur (comme indiqué par les attributs minSdkVersion et targetSdkVersion), vous devez inclure la valeur "screenSize" en plus de la valeur "orientation". C'est-à-dire que vous devez déclarer Android:configChanges="orientation|screenSize". Toutefois, si votre application cible une API de niveau 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 si elle est exécutée sur un périphérique Android 3.2 ou supérieur).

312
Intrications

Vous devez modifier AndroidManifest.xml comme indiqué par Intrications (précédemment Ashton) et vous assurer 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);
}
94
ubershmekel

J'ai toujours trouvé qu'il fallait les deux

Android:screenOrientation="nosensor" Android:configChanges="keyboardHidden|orientation"
39
m00sey

Comme indiqué, définissez Android:configChanges de votre activité (dans le fichier manifeste) sur keyboardHidden|orientation, puis:

1) Remplacer onConfigurationChanged()

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

2) Ajoutez cette ligne à la onCreate() de votre activité.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

C'est mieux que d'ajouter la même ligne à onConfigurationChanged, car votre application passera en mode portrait puis en paysage (cela ne se produira qu'une seule fois, mais c'est agaçant).

Vous pouvez également définir Android:screenOrientation="nosensor" pour votre activité (dans le manifeste). Mais En utilisant cette méthode, vous ne pourrez pas du tout gérer les changements d’orientation.

22
Dmitry Zaytsev

Utilisez ceci..

    Android:screenOrientation="portrait"
20

Dans la méthode OnCreate de votre activité utilisez ce code:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Votre orientation sera maintenant définie sur Portrait et ne changera jamais.

13
Numenor

Dans le fichier AndroidManifest.xml, pour chaque activité que vous souhaitez verrouiller, ajoutez la dernière ligne screenOrientation:

Android:label="@string/app_name"
Android:name=".Login"
Android:screenOrientation="portrait" >

Ou Android: screenOrientation = "paysage".

10
Gil Allen

Dans votre fichier androidmanifest.xml:

   <activity Android:name="MainActivity" Android:configChanges="keyboardHidden|orientation">

ou

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

Pour verrouiller l'écran par code, vous devez utiliser la rotation réelle de l'écran (0, 90, 180, 270) et connaître sa position naturelle. Dans un smartphone, la position naturelle sera portrait et dans une tablette, ce sera paysage.

Voici le code (méthodes de verrouillage et déverrouillage), il a été testé sur certains appareils (smartphones et tablettes) et cela fonctionne très bien.

public static void lockScreenOrientation(Activity activity)
{   
    WindowManager windowManager =  (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);   
    Configuration configuration = activity.getResources().getConfiguration();   
    int rotation = windowManager.getDefaultDisplay().getRotation(); 

    // Search for the natural position of the device    
    if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&  
       (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||  
       configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&   
       (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))   
    {   
        // Natural position is Landscape    
        switch (rotation)   
        {   
            case Surface.ROTATION_0:    
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    
                break;      
            case Surface.ROTATION_90:   
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
            break;      
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
                break;
        }
    }
    else
    {
        // Natural position is Portrait
        switch (rotation) 
        {
            case Surface.ROTATION_0: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
            break;   
            case Surface.ROTATION_90: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
            break;   
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;
        }
    }
}

public static void unlockScreenOrientation(Activity activity)
{
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
5
PoOk

Dans Visual Studio Xamarin:

  1. Ajouter:

using Android.Content.PM; à votre liste d’espaces-noms d’activité.

  1. Ajouter:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

comme attribut à votre classe, comme ça:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}
2
Roy Doron

Veuillez noter qu'aucune des méthodes ne semble fonctionner maintenant!

Dans Android Studio 1, un moyen simple consiste à ajouter Android:screenOrientation="nosensor".

Cela verrouille efficacement l'orientation de l'écran.

0
kephalian

Ajouter

Android:configChanges="keyboardHidden|orientation|screenSize" 

à votre manifeste.

0
saurabh