2011-01-13 5 views
125

Можно создать дубликат:
How to disable orientation change in Android?блокировки ориентации экрана (Android)

Я пишу приложение для Android, который использует вкладки с различным содержанием (деятельности). В одном из этих действий я хотел бы заблокировать ориентацию экрана «Пейзаж» -мод, , но в других действиях я хочу нормальную ориентацию (согласно датчику).

Что я делаю сейчас, что я звоню

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

при переключении в режим активности ландшафтной и

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

при переходе обратно на другие виды деятельности. Однако, похоже, это не работает, все приложение блокируется. Каков нормальный подход к этой проблеме?

+14

Ссылка «Возможное дублирование» - это ** не ** дублирующий вопрос к этому вопросу. Этот вопрос задает вопрос о том, как ** заблокировать ориентацию **, чтобы она не изменилась с ландшафта. Связанный вопрос - это вопрос о том, как ** запретить перезапуск приложения ** при изменении ориентации. – Kent

+0

Это похоже на то, что вы хотите: Вызовите 'Screen.lockOrientation (this)' и позже 'Screen.unlockOrientation (this)' из https://github.com/delight-im/Android-BaseLib/blob/master/Source /src/im/delight/android/baselib/Screen.java – caw

+0

Просто проявите осторожность, если вы используете встроенную ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT, это запрещено до 4.3. Затем вы можете использовать выше или ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT – Akshay

ответ

218

В манифесте вы можете настроить экранОриентации на пейзаж. Это будет выглядеть примерно так в XML:

<activity android:name="MyActivity" 
android:screenOrientation="landscape" 
android:configChanges="keyboardHidden|orientation|screenSize"> 
... 
</activity> 

Где MyActivity тот, который вы хотите остаться в пейзаже.

Строка android:configChanges=... предотвращает появление onResume(), onPause(), когда экран повернут. Без этой строки вращение будет оставаться по вашему запросу, но вызовы все равно будут выполнены.

Примечание: keyboardHidden и orientation необходимы для < Android 3.2 (уровень API 13), и все три варианта требуется 3.2 или выше, а не только orientation.

+0

Это, похоже, не работает; я что-то упускаю? – user573536

+3

Хм, ты прав, что, похоже, не работает, если активность запущена внутри TabHost. Я думаю, что у вас может быть правильная идея с помощью 'setRequestedOrientation', но попробуйте поместить вызов в' onResume', * not * 'onCreate', а в неэлементной деятельности используйте' ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED' вместо 'SENSOR'. Мой эмулятор тоже прослушивался с датчиком, но неуточненный работал –

+0

есть ли какой-либо путь к определенной ориентации для обслуживания. В основном я пишу службу LiveWallpaper ... там, где необходимо ограничить ориентацию устройства. – CoDe

52

У меня была аналогичная проблема.

Когда я вошел

<activity android:name="MyActivity" android:screenOrientation="landscape"></activity> 

В файле манифеста это причиной того, что активность для отображения в ландшафте. Однако, когда я вернулся к предыдущим действиям, они отображались в lanscape, хотя они были настроены на портрет. Однако путем добавления

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

сразу же после того, как раздел OnCreate целевой деятельности разрешил проблему. Поэтому теперь я использую оба метода.

+1

Просто осторожно, если вы используете ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT, это запрещено до 4.3. Затем вы можете использовать выше или ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT – Akshay

+0

Предупреждение. Использование setRequestedOrientation() приведет к перезапуску активности, дважды запуску onResume и т. Д. Добавьте это в свой манифест для каждого действия, где вы делаете это, чтобы избежать этого: android: configChanges = "keyboardHidden | orientation | screenSize" – bluehallu

27

внутри файла манифеста Android вашего проекта, найти декларацию активности которого вы хотите зафиксировать ориентацию и добавьте следующий фрагмент кода,

android:screenOrientation="landscape" 

для альбомной ориентации и для портретной добавить следующий код ,

android:screenOrientation="portrait" 
Смежные вопросы