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


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.