Як я можу отримати поточну орієнтацію екрана?


190

Я просто хочу встановити деякі прапори, коли моя орієнтація знаходиться на пейзажі, щоб, коли активність відтворена в onCreate (), я могла перемикатися між тим, що потрібно завантажувати в портретному та пейзажному. У мене вже є xml-макет xland, який обробляє мій макет.

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

Перезавантаження на onConfigurationChanged не дозволить завантажувати xml-макет макета в альбомну орієнтацію.

Я просто хочу отримати поточну орієнтацію свого пристрою в onCreate (). Як я можу це отримати?

Відповіді:


475
Activity.getResources().getConfiguration().orientation

8
Це забезпечує лише два значення ORIENTATION_PORTRAIT та ORIENTATION_LANDSCAPE. Чи є спосіб отримати всі чотири значення від ActivityInfo? (Це також LANDSCAPE_REVERSE та PORTRAIT_REVERSE)
HRJ

18
@HRJ ви можете використовувати getWindowManager (). GetDefaultDisplay (). GetRotation ()
MKJParekh

24
getWindowManager (). getDefaultDisplay (). getRotation () повертає обертання з посиланням на "природну" орієнтацію дисплея, тобто для планшетного ПК він повертає Surface.ROTATION_0 в альбомному режимі, тоді як для мобільного телефону він повертає те саме значення для портрет.
Золтан

65
int orientation = this.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // code for portrait mode
} else {
    // code for landscape mode
}

Коли суперклас thisISContext


28

У деяких пристроях void onConfigurationChanged()може вийти з ладу. Користувач буде використовувати цей код для отримання поточної орієнтації на екран.

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

І використовувати

if (orientation==1)        // 1 for Configuration.ORIENTATION_PORTRAIT
{                          // 2 for Configuration.ORIENTATION_LANDSCAPE
   //your code             // 0 for Configuration.ORIENTATION_SQUARE
}

1
Зауважте, що getOrient.getWidth () та getOrient.getHeight () тепер застарілі.
валерибодак

Слід зазначити правильну відповідь, як детальніше
Zapnologica

1
Слід зазначити як правильну відповідь і найкраще працює в будь-яких умовах. Але зауважте, що anivaler сказав, що getActivity (). GetWindowManager (). GetDefaultDisplay (). GetWidth () і getHeight () застаріло. Будь ласка, використовуйте getSize (Невеликий розмір). Він може бути використаний як передаючий новий точковий об'єкт, і він отримає свої члени x та y.
Mahendra Chhimwal

як Point OutSize = нова точка (); getOrient.getSize (outSize); якщо (outSize.x == outSize.y) повернути SQUARE;
Mahendra Chhimwal

Думаю, я хотів би зазначити, що Configuration.ORIENTATION_SQUARE є застарілим, і хоча він, можливо, був визначений як 0 у 2013 році, він визначається як 3, тоді як Configuration.ORIENTIATION_UNDEFINED визначається як 0. Ура.
Дейв

26
int rotation =  getWindowManager().getDefaultDisplay().getRotation();

це дає усю орієнтацію як нормальну, так і зворотну

і поводитись так, як

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

final int angle = (rotation == Surface.ROTATION_90) ? 90 : (rotation == Surface.ROTATION_180) ? 180 : (rotation == Surface.ROTATION_270) ? 270 : 0;
Андрій Сирокомський

12
getActivity().getResources().getConfiguration().orientation

ця команда повертає значення int 1 для портрета та 2 для альбому


4

У випадку, якщо хтось хотів би отримати змістовний опис орієнтації (на зразок тієї, що передається onConfigurationChanged(..)тим reverseLandscape, sensorLandscapeі так далі), просто використовуйтеgetRequestedOrientation()


1

У класі занять використовуйте наведений нижче метод:

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

Потім, щоб заявити, що ваша активність обробляє зміну конфігурації, відредагуйте відповідний елемент у вашому файлі маніфесту, щоб включити android:configChangesатрибут зі значенням, яке представляє конфігурацію, з якою ви хочете обробити. Можливі значення перераховані в документації щодо android:configChangesатрибута (найбільш часто використовувані значення - це "орієнтація" для запобігання перезапуску при зміні орієнтації екрана та "клавіатура прихована" для запобігання перезапуску, коли змінюється наявність клавіатури). Ви можете оголосити декілька значень конфігурації в атрибуті, відокремивши їх трубою | характер.

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

Це все!!


0

якщо ви хочете замінити цей метод onConfigurationChanged і все ще хочете, щоб він виконував основні речі, тоді розгляньте можливість використання super.onConfigyrationChanged () в якості першого твердження методу overriden.


0

Я просто хочу запропонувати ще одну альтернативу, яка стосуватиметься деяких із вас:

android:configChanges="orientation|keyboardHidden" 

Мається на увазі, що ми явно оголошуємо макет, який потрібно вводити.

У випадку, якщо ми хочемо зберегти автоматичну ін'єкцію завдяки папці макет-земля та макет. Все, що вам потрібно зробити - це додати його до onCreate:

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

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

Тут ми відображаємо чи не панель дій залежно від орієнтації телефону

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.