it-swarm.com.ru

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

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

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 (), где я могу обрабатывать ориентацию, но мне не нужно вручную перерисовывать вид.

20
Yong Fei

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

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

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

int orientation = display.getOrientation();

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

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Я надеюсь, что это помогает.

Обновление

Хорошо, допустим, у вас есть переменная oAllow, которая 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            
}
44
Ogulcan Orhan

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

getResources().getConfiguration().orientation

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

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

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

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

<Activity Android: name = ". MyActivity"
Android: configChanges = "ориентация | keyboardHidden"
Android: метка = "@ строка/app_name">

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

...

18
Talihawk
if (this.getWindow().getWindowManager().getDefaultDisplay()
    .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
  // portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
           .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
  // landscape
}
3
Dwivedi Ji

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

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

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

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

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

1
Steve Waring

Проверьте ориентацию экрана 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);
}
0
Rahul Raina

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

public boolean isLandscape() {
    return Resources.getSystem().getDisplayMetrics().widthPixels - Resources.getSystem().getDisplayMetrics().heightPixels > 0;
}
0
IQ.feature