Как узнать текущую ориентацию экрана?


190

Я просто хочу установить некоторые флаги, когда моя ориентация в альбомной ориентации, чтобы при воссоздании активности в onCreate () я мог переключаться между тем, что загружать в портретной или альбомной ориентации. У меня уже есть XML-файл layout-land, который обрабатывает мой макет.

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 предотвратит загрузку моего layout-land xml в альбомной ориентации.

Я просто хочу получить текущую ориентацию моего устройства в onCreate (). Как я могу получить это?

Ответы:


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

8
Это обеспечивает только два значения ORIENTATION_PORTRAIT и ORIENTATION_LANDSCAPE. Есть ли способ получить все четыре значения из ActivityInfo? (Это также
— LANDSCAPE_REVERSE

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 () устарели.
— valerybodak

Должен быть отмечен как правильный ответ, как это более подробно
— Zapnologica

1
Должен быть отмечен как правильный ответ и лучше всего работает в любых условиях. Но учтите, что, как сказал anivaler, getActivity (). GetWindowManager (). GetDefaultDisplay (). GetWidth () и getHeight () устарели. Пожалуйста, используйте getSize (Point outsize). Он может использоваться как проходящий новый точечный объект, и он получит свои члены x и y.
— Махендра Чхимвал

like Point outSize = new point (); getOrient.getSize (outSize); if (outSize.x == outSize.y) return SQUARE;
— Махендра Чимвал

Я подумал, что должен указать, что Configuration.ORIENTATION_SQUARE устарел, и хотя в 2013 году он мог быть определен как 0, он определен как 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;
— Андрей Сырокомский


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 () в качестве первого оператора в переопределенном методе.


0

Я просто хочу предложить другую альтернативу, которая затронет некоторых из вас:

android:configChanges="orientation|keyboardHidden" 

подразумевает, что мы явно объявляем макет для внедрения.

В случае, если мы хотим сохранить автоматический впрыск благодаря папкам layout-land и layout. Все, что вам нужно сделать, это добавить его в 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.