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

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
EboMike
источник
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
}
Sakthimuthiah
источник
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;
}
AndroidBeginner
источник
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 для Portrait и 2 для Landscape

Рудольф Коутиньо
источник
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">

Вот и все!!

DalveerSinghDaiya
источник
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();
    }

Здесь мы отображаем или нет панель действий в зависимости от ориентации телефона

Z3nk
источник