Подтвердить что ты не робот

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?

EDIT: Я действительно ищу ответ на Где обрабатывать изменения ориентации. Я не хочу фиксировать ориентацию, добавляя screenOrientation = "портрет".

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

4b9b3361

Ответ 1

Сначала вам нужен экземпляр 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;
    }
}

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

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

UPDATE

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            
}

Ответ 2

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

getResources().getConfiguration().orientation

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

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

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

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

< активность android: name= ". MyActivity"
          андроид: configChanges = "ориентация | keyboardHidden"
          Android: метка = "@строка/имя_приложение" >

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

...

Ответ 3

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

Ответ 4

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

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

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

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

Pre Jellybean use ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE - без вращения на 180 градусов с этим.

Ответ 5

Проверьте ориентацию экрана Android в режиме Runtime:

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);
}