2012-02-29 12 views
18

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

+0

Вам не нужно, чтобы перехватить запрос, а затем разрешить или запретить его. Вы можете заблокировать или освободить ориентацию заранее. Есть также больше вариантов с этим методом, например, разрешить ли поворот на 180 градусов при блокировке. Пожалуйста, прочтите мой ответ ниже, а не выбранный. –

ответ

42

Вам нужен Display экземпляр во-первых:

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

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

int orientation = display.getOrientation(); 

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

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

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

Update:

Хорошо, предположим, что вы имеете в 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; 
    } 
} 

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

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

UPDATE

getOrientation() уже устарела see here. Вместо этого используйте 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    
} 
+0

спасибо, но где я могу поместить код? Я имею в виду, какое событие/функция срабатывает при изменении ориентации? –

+0

@kenyi Просто что вам нужно сделать? Дайте больше деталей. Вам просто нужно ориентироваться или что? Я уточню свой ответ. –

+0

Прежде чем устройство изменит ориентацию, мне нужно определить, разрешен ли ландшафтный режим во время выполнения. Предположим, что если пользователь отключил ландшафтный режим, приложение останется в портретном режиме. –

17

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

getResources().getConfiguration().orientation 

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

для того, чтобы поймать событие изменения ориентации вы можете найти ответ в руководстве Android Dev: Handling the Configuration Change Yourself

От руководства:

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

< активность андроид: имя =
«MyActivity.» андроид: configChanges = "ориентация | keyboardHidden"
андроид: метка = "@ строка/app_name" >

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

...

+0

Привет, я обновил свой вопрос. Я знаю, как получить ориентацию экрана, мне нужно знать, ГДЕ это нужно. –

+0

Привет, проверьте последнюю ссылку в моем ответе ... [Обработка изменения конфигурации самостоятельно] (http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange). Я отредактировал свой ответ с дополнительной информацией – Talihawk

2
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

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

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

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

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

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

0

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

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); 
} 
Смежные вопросы