Android определяет ориентацию экрана во время выполнения - PullRequest
20 голосов
/ 01 марта 2012

Вот псевдокод для обнаружения события поворота экрана и принятия решения о сохранении или изменении ориентации экрана.

public boolean onOrientationChanges(orientation) {
  if(orientation == landscape)
    if(settings.get("lock_orientation"))
      return false;   // Retain portrait mode
    else
      return true; // change to landscape mode

  return true; 
}

Как создать аналогичные вещи в Android?

РЕДАКТИРОВАТЬ: Я на самом деле ищу ответ на Где обрабатывать изменения ориентации .Я не хочу, чтобы исправить ориентацию, добавив screenOrientation = "Portrait".

Мне нужно что-то похожее на onConfigurationChanges (), где я могу обрабатывать ориентацию, но мне не нужно вручную перерисовывать вид.

Ответы [ 6 ]

46 голосов
/ 01 марта 2012

Сначала вам нужен экземпляр Display:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

Тогда ориентация может быть названа так:

int orientation = display.getOrientation();

Проверьте ориентацию как свой путь и используйте ее для изменить ориентацию :

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Надеюсь, это поможет.

Обновление :

Хорошо, допустим, у вас есть oAllow var, равное Boolean, и значение по умолчанию False.

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    int orientation = display.getOrientation(); 
    switch(orientation) {
        case Configuration.ORIENTATION_PORTRAIT:
            if(!oAllow) {
                    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
            break;
        case Configuration.ORIENTATION_LANDSCAPE:
            if(!oAllow) {
                    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            break;
    }
}

Вы можете добавить больше вариантов.

Я не пробовал этот пример, но, по крайней мере, скажу вам некоторыеподсказки о том, как решить.Сообщите мне, если вы получили какую-либо ошибку.

ОБНОВЛЕНИЕ

getOrientation() уже устарело см. Здесь .Вместо этого используйте getRotation().Чтобы проверить, находится ли устройство в ландшафтном режиме, вы можете сделать что-то вроде этого:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
        .getDefaultDisplay();

int orientation = display.getRotation();

if (orientation == Surface.ROTATION_90
        || orientation == Surface.ROTATION_270) {
    // TODO: add logic for landscape mode here            
}
18 голосов
/ 01 марта 2012

Попробуйте запустить

getResources().getConfiguration().orientation

Из вашего объекта контекста, чтобы выяснить, какова ориентация экрана во время выполнения, возможные значения задокументированы здесь

Для того, чтобыпоймать событие изменения ориентации вы можете найти ответ в Android Dev Guide: Обработка изменения конфигурации самостоятельно

Из руководства:

Например,следующий код манифеста объявляет действие, которое обрабатывает как изменение ориентации экрана, так и изменение доступности клавиатуры:



Теперь, когда одна из этих конфигураций изменяется, MyActivity не перезапускается.Вместо этого MyActivity получает вызов onConfigurationChanged ().Этот метод передается объект конфигурации, который указывает новую конфигурацию устройства.Читая поля в конфигурации, вы можете определить новую конфигурацию и внести соответствующие изменения, обновив ресурсы, используемые в вашем интерфейсе.Во время вызова этого метода объект ресурсов вашей деятельности обновляется, чтобы возвращать ресурсы на основе новой конфигурации, поэтому вы можете легко сбросить элементы вашего интерфейса без перезапуска системы.

...

3 голосов
/ 09 июля 2012
if (this.getWindow().getWindowManager().getDefaultDisplay()
    .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
  // portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
           .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
  // landscape
}
1 голос
/ 03 августа 2014

Вам не нужно перехватывать событие, а затем переопределять его.Просто используйте:

// Allow rotation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
// Lock rotation (to Landscape)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE);

Обратите внимание на следующие моменты: если на Jellybean и выше, это позволит поворот на 180 градусов при блокировке.Также, когда разблокировано, это позволяет вращение, только если в основных настройках пользователя разрешено вращение.Вы можете запретить поворот на 180 градусов, переопределить основные настройки и разрешить вращение, а также многое другое, поэтому проверьте параметры в ActivityInfo

Кроме того, если вы предварительно установили, что тамэто означает отсутствие вращения, тогда ваша активность не будет уничтожена, а затем перезапущена, просто для того, чтобы вы вернули ориентацию, которая снова приведет к перезапуску активности;Таким образом, установка того, что вы хотите заранее, может быть гораздо более эффективной .

Предварительное использование желе ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE - с этим нет поворота на 180 градусов.

0 голосов
/ 18 февраля 2019

Другое решение для определения ориентации экрана:

public boolean isLandscape() {
    return Resources.getSystem().getDisplayMetrics().widthPixels - Resources.getSystem().getDisplayMetrics().heightPixels > 0;
}
0 голосов
/ 07 сентября 2016

Проверьте ориентацию экрана Android во время выполнения:

ListView listView = (ListView) findViewById(R.id.listView1);
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
    //do work for landscape screen mode.
    listView.setPadding(0, 5, 0, 1);
} else if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
    //Do work for portrait screen mode.
    listView.setPadding(1, 10, 1, 10);
}
...