Comment puis-je obtenir l'orientation actuelle de l'écran?

190

Je veux juste définir des indicateurs lorsque mon orientation est en paysage afin que lorsque l'activité est recréée dans onCreate (), je puisse basculer entre ce qu'il faut charger en portrait et en paysage. J'ai déjà un xml layout-land qui gère ma mise en page.

public void onConfigurationChanged(Configuration _newConfig) {

        if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            this.loadURLData = false;
        }

        if (_newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            this.loadURLData = true;
        }

        super.onConfigurationChanged(_newConfig);
    }

Over-riding onConfigurationChanged empêchera mon fichier XML layout-land de se charger en orientation paysage.

Je veux juste obtenir l'orientation actuelle de mon appareil dans onCreate (). Comment puis-je l'obtenir?

Sheehan Alam
la source

Réponses:

475
Activity.getResources().getConfiguration().orientation
EboMike
la source
8
Cela ne fournit que deux valeurs ORIENTATION_PORTRAIT et ORIENTATION_LANDSCAPE. Existe-t-il un moyen d'obtenir les quatre valeurs de ActivityInfo? (C'est aussi LANDSCAPE_REVERSE et PORTRAIT_REVERSE)
HRJ
18
@HRJ vous pouvez utiliser getWindowManager (). GetDefaultDisplay (). GetRotation ()
MKJParekh
24
getWindowManager (). getDefaultDisplay (). getRotation () retourne la rotation en référence à l'orientation "naturelle" de l'affichage, c'est-à-dire que pour une tablette, elle renverrait Surface.ROTATION_0 en mode paysage, alors que pour un téléphone portable, elle renverrait la même valeur pour portrait.
Zoltán
65
int orientation = this.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // code for portrait mode
} else {
    // code for landscape mode
}

Quand la superclasse thisestContext

Daniel
la source
28

Dans certains appareils, cela void onConfigurationChanged()peut planter. L'utilisateur utilisera ce code pour obtenir l'orientation actuelle de l'écran.

public int getScreenOrientation()
{
    Display getOrient = getActivity().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;
}

Et utilise

if (orientation==1)        // 1 for Configuration.ORIENTATION_PORTRAIT
{                          // 2 for Configuration.ORIENTATION_LANDSCAPE
   //your code             // 0 for Configuration.ORIENTATION_SQUARE
}
Sakthimuthiah
la source
1
Veuillez noter que getOrient.getWidth () et getOrient.getHeight () sont désormais obsolètes.
valerybodak
Doit être marqué comme la bonne réponse car c'est beaucoup plus détaillé
Zapnologica
1
Doit être marqué comme réponse correcte et fonctionne mieux dans toutes les conditions. Mais s'il vous plaît noter qu'un équivalent dit que getActivity (). GetWindowManager (). GetDefaultDisplay (). GetWidth () et getHeight () est désormais obsolète. Veuillez utiliser getSize (Taille du point). Il peut être utilisé comme un nouvel objet point passant et qui obtiendra ses membres x et y.
Mahendra Chhimwal
comme Point outSize = nouveau point (); getOrient.getSize (outSize); if (outSize.x == outSize.y) return SQUARE;
Mahendra Chhimwal
Je pensais que je ferais remarquer que Configuration.ORIENTATION_SQUARE est obsolète et bien qu'il ait été défini comme 0 en 2013, il est défini comme 3, tandis que Configuration.ORIENTIATION_UNDEFINED est défini comme 0. Cheers.
Dave
26
int rotation =  getWindowManager().getDefaultDisplay().getRotation();

cela donnera toute l'orientation comme normale et inverse

et le gérer comme

int angle = 0;
switch (rotation) {
    case Surface.ROTATION_90:
        angle = -90;
        break;
    case Surface.ROTATION_180:
        angle = 180;
        break;
    case Surface.ROTATION_270:
        angle = 90;
        break;
    default:
        angle = 0;
        break;
}
AndroidBeginner
la source
final int angle = (rotation == Surface.ROTATION_90) ? 90 : (rotation == Surface.ROTATION_180) ? 180 : (rotation == Surface.ROTATION_270) ? 270 : 0;
Andrey Syrokomskiy
12
getActivity().getResources().getConfiguration().orientation

cette commande renvoie la valeur int 1 pour Portrait et 2 pour Paysage

Rudolf Coutinho
la source
4

Au cas où quelqu'un voudrait obtenir une description d'orientation significative (comme celle transmise onConfigurationChanged(..)avec ceux-ci reverseLandscape, sensorLandscapeetc.), utilisez simplementgetRequestedOrientation()

a.ch.
la source
1

Dans votre classe d'activités, utilisez la méthode ci-dessous:

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

            setlogo();// Your Method
            Log.d("Daiya", "ORIENTATION_LANDSCAPE");

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

            setlogoForLandScape();// Your Method
            Log.d("Daiya", "ORIENTATION_PORTRAIT");
        }
    }

Ensuite, pour déclarer que votre activité gère une modification de configuration, modifiez l'élément approprié dans votre fichier manifeste pour inclure l' android:configChangesattribut avec une valeur qui représente la configuration que vous souhaitez gérer. Les valeurs possibles sont répertoriées dans la documentation de l' android:configChangesattribut (les valeurs les plus couramment utilisées sont "orientation" pour empêcher les redémarrages lorsque l'orientation de l'écran change et "keyboardHidden" pour empêcher les redémarrages lorsque la disponibilité du clavier change). Vous pouvez déclarer plusieurs valeurs de configuration dans l'attribut en les séparant par un tube | personnage.

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

C'est tout!!

DalveerSinghDaiya
la source
0

si vous voulez remplacer cette méthode onConfigurationChanged et que vous voulez toujours qu'elle fasse les choses de base, envisagez d'utiliser super.onConfigyrationChanged () comme première instruction de la méthode overriden.

Samarth S
la source
0

Je veux juste proposer une autre alternative qui concernera certains d'entre vous:

android:configChanges="orientation|keyboardHidden" 

implique que nous déclarons explicitement la mise en page à injecter.

Au cas où nous souhaiterions conserver l'injection automatique grâce aux dossiers layout-land et layout. Tout ce que vous avez à faire est de l'ajouter à onCreate:

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getSupportActionBar().hide();

    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        getSupportActionBar().show();
    }

Ici, on affiche ou non la barre d'action en fonction de l'orientation du téléphone

Z3nk
la source