Jak mogę uzyskać bieżącą orientację ekranu?

190

Chcę tylko ustawić flagi, gdy moja orientacja jest w układzie poziomym, aby po odtworzeniu działania w onCreate () mogłem przełączać między tym, co załadować w pionie a w poziomie. Mam już plik XML-układ-ziemia, który obsługuje mój układ.

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 uniemożliwi ładowanie mojego xml-land-land w orientacji poziomej.

Chcę tylko uzyskać bieżącą orientację mojego urządzenia w funkcji onCreate (). Jak mogę to zdobyć?

Sheehan Alam
źródło

Odpowiedzi:

475
Activity.getResources().getConfiguration().orientation
EboMike
źródło
8
Zapewnia to tylko dwie wartości ORIENTATION_PORTRAIT i ORIENTATION_LANDSCAPE. Czy istnieje sposób na uzyskanie wszystkich czterech wartości z ActivityInfo? (To znaczy LANDSCAPE_REVERSE i PORTRAIT_REVERSE)
HRJ
18
@HRJ możesz użyć getWindowManager (). GetDefaultDisplay (). GetRotation ()
MKJParekh
24
getWindowManager (). getDefaultDisplay (). getRotation () zwraca obrót w odniesieniu do „naturalnej” orientacji wyświetlacza, tj. dla tabletu zwróci Surface.ROTATION_0 w trybie poziomym, podczas gdy dla telefonu komórkowego zwróci tę samą wartość dla portret.
Zoltán
65
int orientation = this.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // code for portrait mode
} else {
    // code for landscape mode
}

Gdy nadklasą thisIsContext

Daniel
źródło
28

W niektórych urządzeniach void onConfigurationChanged()może wystąpić awaria. Użytkownik użyje tego kodu, aby uzyskać bieżącą orientację ekranu.

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;
}

I użyć

if (orientation==1)        // 1 for Configuration.ORIENTATION_PORTRAIT
{                          // 2 for Configuration.ORIENTATION_LANDSCAPE
   //your code             // 0 for Configuration.ORIENTATION_SQUARE
}
Sakthimuthiah
źródło
1
Należy pamiętać, że getOrient.getWidth () i getOrient.getHeight () są już nieaktualne.
valerybodak
Należy zaznaczyć jako poprawną odpowiedź, ponieważ jest ona bardziej szczegółowa
Zapnologica
1
Powinien być oznaczony jako poprawna odpowiedź i działa najlepiej w każdych warunkach. Należy jednak pamiętać, że anivaler powiedział, że getActivity (). GetWindowManager (). GetDefaultDisplay (). GetWidth () i getHeight () są już nieaktualne. Proszę użyć getSize (punkt poza wymiarami). Można go wykorzystać jako nowy obiekt punktowy, który otrzyma jego elementy xiy.
Mahendra Chhimwal
jak Point outSize = new point (); getOrient.getSize (outSize); if (outSize.x == outSize.y) zwraca KWADRAT;
Mahendra Chhimwal
Myślałem, że zwrócę uwagę, że Configuration.ORIENTATION_SQUARE jest przestarzały i chociaż mógł być zdefiniowany jako 0 w 2013 roku, jest zdefiniowany jako 3, natomiast Configuration.ORIENTIATION_UNDEFINED jest zdefiniowany jako 0. Pozdrawiam.
Dave
26
int rotation =  getWindowManager().getDefaultDisplay().getRotation();

da to całą orientację normalną i odwrotną

i radzę sobie z tym jak

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
źródło
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

to polecenie zwraca wartość int 1 dla Portret i 2 dla Krajobraz

Rudolf Coutinho
źródło
4

W przypadku, gdy ktoś chciałby uzyskać znaczący opis orientacji (tak przekazane onConfigurationChanged(..)z tych reverseLandscape, sensorLandscapei tak dalej), wystarczy użyćgetRequestedOrientation()

a.ch.
źródło
1

W swojej klasie aktywności użyj poniższej metody:

 @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");
        }
    }

Następnie, aby zadeklarować, że twoje działanie obsługuje zmianę konfiguracji, edytuj odpowiedni element w pliku manifestu, aby dołączyć android:configChangesatrybut o wartości reprezentującej konfigurację, którą chcesz obsłużyć. Możliwe wartości są wymienione w dokumentacji tego android:configChangesatrybutu (najczęściej używane wartości to „orientacja”, aby zapobiec restartowaniu, gdy zmienia się orientacja ekranu, i „klawiatura ukryta”, aby zapobiec restartowaniu, gdy zmienia się dostępność klawiatury). Możesz zadeklarować wiele wartości konfiguracji w tym atrybucie, oddzielając je potokiem | postać.

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

To wszystko!!

DalveerSinghDaiya
źródło
0

jeśli chcesz przesłonić tę metodę onConfigurationChanged i nadal chcesz wykonywać podstawowe czynności, rozważ użycie super.onConfigyrationChanged () jako pierwszej instrukcji w metodzie przesłonięcia.

Samarth S.
źródło
0

Chcę tylko zaproponować inną alternatywę, która dotyczy niektórych z was:

android:configChanges="orientation|keyboardHidden" 

oznacza, że ​​jednoznacznie deklarujemy układ do wstrzyknięcia.

W przypadku, gdy chcemy zachować automatyczne wprowadzanie dzięki folderom lay-land i layout. Wszystko, co musisz zrobić, to dodać go do programu onCreate:

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

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

Tutaj wyświetlamy lub nie pasek akcji w zależności od orientacji telefonu

Z3nk
źródło