467 votes

Vérifier l'orientation sur un téléphone Android

Comment puis-je vérifier si le téléphone Android est en mode Paysage ou Portrait ?

1 votes

Jetez un coup d'œil à cette réponse sur un fil similaire : stackoverflow.com/a/26601009/3072449

0 votes

Pourquoi ne pas simplement ajouter une étiquette Kotlin, ce qui faciliterait les recherches avec le mot clé Kotlin.

754voto

hackbod Points 55292

La configuration actuelle, telle qu'elle est utilisée pour déterminer les ressources à récupérer, est disponible dans l'onglet "Ressources". Configuration objet :

getResources().getConfiguration().orientation;

Vous pouvez vérifier l'orientation en regardant sa valeur :

int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // In landscape
} else {
    // In portrait
}

Vous trouverez de plus amples informations dans le Développeur Android .

2 votes

Oh désolé j'ai mal compris, je pensais que vous disiez que le service ne verrait pas le changement de configuration si la configuration change. Ce que vous décrivez est que... eh bien, il ne voit rien, parce que rien ne change, parce que le lanceur a verrouillé l'orientation de l'écran et ne lui permet pas de changer. Il est donc exact que l'orientation ne change pas, car l'orientation n'a pas changé. L'écran est toujours en mode portrait.

0 votes

La chose la plus proche que je puisse faire est de lire l'orientation à partir des capteurs, ce qui implique des mathématiques que je n'ai pas vraiment envie de comprendre pour le moment.

13 votes

Il n'y a pas de quoi s'énerver. L'écran n'a pas tourné, il est toujours en mode portrait, il n'y a pas de rotation à voir. Si vous voulez surveiller la façon dont l'utilisateur déplace son téléphone indépendamment de la rotation de l'écran, alors oui, vous devez observer directement le capteur et décider comment interpréter les informations que vous obtenez sur la façon dont l'appareil se déplace.

173voto

Jarek Potiuk Points 5104

Si vous utilisez getResources().getConfiguration().orientation sur certains appareils, vous vous tromperez. Nous avons utilisé cette approche initialement dans http://apphance.com . Grâce à l'enregistrement à distance d'Apphance, nous avons pu le voir sur différents appareils et nous avons vu que la fragmentation joue son rôle ici. J'ai vu des cas étranges : par exemple l'alternance portrait et carré( ?!) sur le HTC Desire HD :

CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square

ou ne pas changer d'orientation du tout :

CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0

D'autre part, width() et height() sont toujours corrects (ils sont utilisés par le gestionnaire de fenêtres, donc il vaut mieux qu'ils le soient). Je dirais que la meilleure idée est de faire la vérification de la largeur/hauteur TOUJOURS. Si vous réfléchissez un instant, c'est exactement ce que vous voulez - savoir si la largeur est plus petite que la hauteur (portrait), l'inverse (paysage) ou si elles sont identiques (carré).

Alors ça se résume à ce simple code :

public int getScreenOrientation()
{
    Display getOrient = getWindowManager().getDefaultDisplay();
    int orientation = Configuration.ORIENTATION_UNDEFINED;
    if(getOrient.getWidth()==getOrient.getHeight()){
        orientation = Configuration.ORIENTATION_SQUARE;
    } else{ 
        if(getOrient.getWidth() < getOrient.getHeight()){
            orientation = Configuration.ORIENTATION_PORTRAIT;
        }else { 
             orientation = Configuration.ORIENTATION_LANDSCAPE;
        }
    }
    return orientation;
}

3 votes

Merci. L'initialisation de "orientation" est cependant superflue.

0 votes

getWidth et getHeight ne sont pas dépréciés.

3 votes

@user3441905, oui ils le sont. Utilisez getSize(Point outSize) à la place. J'utilise l'API 23.

57voto

Paul Points 453

Une autre façon de résoudre ce problème est de ne pas compter sur la valeur de retour correcte de l'affichage mais de compter sur la résolution des ressources Android.

Créer le fichier layouts.xml dans les dossiers res/values-land et res/values-port avec le contenu suivant :

res/values-land/layouts.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">true</bool>
</resources>

res/values-port/layouts.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">false</bool>
</resources>

Dans votre code source, vous pouvez maintenant accéder à l'orientation actuelle comme suit :

context.getResources().getBoolean(R.bool.is_landscape)

2 votes

J'aime cette méthode car elle utilise la manière dont le système détermine déjà l'orientation.

1 votes

Meilleure réponse pour le contrôle des paysages/portraits !

2 votes

Quelle sera sa valeur dans le fichier des valeurs par défaut ?

50voto

Nguyen Minh Binh Points 6438

Un moyen complet de spécifier l'orientation actuelle du téléphone :

public String getRotation(Context context) {
    final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
    switch (rotation) {
        case Surface.ROTATION_0:
            return "portrait";
        case Surface.ROTATION_90:
            return "landscape";
        case Surface.ROTATION_180:
            return "reverse portrait";
        default:
            return "reverse landscape";
    }
}

6 votes

Il y a une faute de frappe dans votre message - il faut dire .getRotation() et non getOrientation.

1 votes

+1 pour ça. J'avais besoin de connaître l'orientation exacte, pas seulement le paysage ou le portrait. getOrientation() est correct, sauf si vous êtes sur SDK 8+, auquel cas vous devriez utiliser getRotation(). Les modes "reverse" sont supportés par le SDK 9+.

7 votes

@Keith @Paul Je ne me souviens pas comment getOrientation() fonctionne, mais ce n'est pas correct si l'on utilise getRotation() . Obtenir la rotation "Returns the rotation of the screen from its "natural" orientation." [source](http://developer.android.com/reference/android/view/Display.html#getRotation()) . Ainsi, sur un téléphone, dire que ROTATION_0 est en portrait est probablement correct, mais sur une tablette, son orientation "naturelle" est probablement en paysage et ROTATION_0 devrait renvoyer paysage au lieu de portrait.

30voto

NguyenDat Points 2032

Voici un extrait de code qui démontre comment obtenir l'orientation de l'écran, recommandé par hackbod et Martijn :

Déclenchement lors d'un changement d'orientation :

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
        int nCurrentOrientation = _getScreenOrientation();
    _doSomeThingWhenChangeOrientation(nCurrentOrientation);
}

Obtenir l'orientation actuelle en tant que hackbod recommander :

private int _getScreenOrientation(){    
    return getResources().getConfiguration().orientation;
}

Il existe d'autres solutions pour obtenir l'orientation actuelle de l'écran. Martijn solution :

private int _getScreenOrientation(){
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        return display.getOrientation();
}

Note : J'ai essayé de mettre en œuvre & , mais sur RealDevice (NexusOne SDK 2.3) Orientation, il renvoie la mauvaise orientation.

Donc i recommander la solution utilisée pour obtenir Screen orientation qui a plus d'avantage : clair, simple et fonctionne comme un charme.

Vérifiez soigneusement le retour d'orientation pour vous assurer qu'il est correct et conforme à nos attentes (il peut y avoir des limitations en fonction des spécifications des appareils physiques).

J'espère que cela vous aidera,

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