2010-01-27 4 views
118

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

ответ

28

Вы можете указать ориентацию деятельности в манифесте. См. here.

<activity android:allowTaskReparenting=["true" | "false"] 
... 
      android:screenOrientation=["unspecified" | "user" | "behind" | 
            "landscape" | "portrait" | 
            "sensor" | "nosensor"] 
... 
             "adjustResize", "adjustPan"] > 
109

Вы также можете установить те же данные в своем Java-коде.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Другие значения в ActivityInfo позволят вам установить его обратно на сенсорный или заблокированный портрет. Лично мне нравится указывать что-то в манифесте, как предлагается в другом ответе на этот вопрос, а затем изменить его позже, используя вышеупомянутый вызов в Android SDK, если есть такая необходимость.

+9

Хотя это работает, оно заставляет активность перезапускаться. – Yegor

166

Глядя на AndroidManifest.xml (link), в строке 9:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity"> 

Эта строка определяет screenOrientation как пейзаж, но автор идет дальше в переопределении любой ориентации экрана меняется с configChanges="orientation|keyboardHidden". Это указывает на переопределенную функцию в VncCanvasActivity.java.

Если посмотреть на VncCanvasActivity, на линии 109 является перекрытая функция:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    // ignore orientation/keyboard change 
    super.onConfigurationChanged(newConfig); 
} 

Автор специально поставил комментарий игнорировать любые клавиатуры или ориентации изменения.


Если вы хотите изменить это, вы можете вернуться к файлу AndroidManifest.xml показан выше, и измените строку:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity"> 

Это должно изменить программу, чтобы перейти от портретного когда пользователь поворачивает устройство.

Это может сработать, но может испортить внешний вид GUI, в зависимости от того, как был создан макет. Вам придется это учитывать. Кроме того, в зависимости от того, как кодируются действия, вы можете заметить, что при изменении ориентации экрана значения, заполненные в любые поля ввода, исчезают. Возможно, это также придется обрабатывать.

+2

Почему именно атрибут 'configChanges' нужен? Кажется, это работает на моем телефоне без клавиатуры без него ... В каких ситуациях ориентация изменится на портрет, если у вас есть screenOrientation = "landscape", но опустите 'configChanges'? – Timmmm

+0

в новых версиях вы также должны указать screenSize: ['Если ваше приложение нацелено на уровень API 13 или выше (как указано атрибутами minSdkVersion и targetSdkVersion), вы также должны объявить конфигурацию« screenSize », так как она также изменяется, когда устройство переключается между портретной и альбомной ориентацией. '] (http://developer.android.com/guide/topics/manifest/activity-element.html) – Cel

+0

как заставить встроенную активность, например, выбирать библиотеку выбора изображения только в ландшафте или только портрет? – Jacky

3

Арслан, почему вы хотите, чтобы ориентация про грамматически, но уже есть способ манифеста <activity android:name=".youractivityName" android:screenOrientation="portrait" />

+0

Им не апеллятором, но, может быть, он хочет сделать программным путем, потому что хочет заставить его в определенное время? –

8

Ниже приведен код, который я использовал для отображения всей активности в ландшафтном режиме:

<activity android:screenOrientation="landscape" 
      android:configChanges="orientation|keyboardHidden" 
      android:name="abcActivty"/> 
+0

«Ориентация» Если ваше приложение нацелено на уровень API 13 или выше, вы также должны объявить «screenSize» –

33

В моей OnCreate(Bundle) я вообще сделать следующее:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
+0

спасибо ..u сделал день –

+0

метод манифеста в других ответах, похоже, не работал, но @anwarma yours сделал – Anup

4

Вот и все! Долго ждать этого исправления.

Я старый Android вопрос о двойном начать деятельность, которая требует (программно) ландшафтного режима: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Теперь Android сделать ландшафтный режим на старте.

-23

Нажмите CTRL+F11, чтобы повернуть экран.

+3

Они хотят теперь, как настроить ориентацию по умолчанию приложения, а не как экран можно повернуть. –

+0

CTRL + f12 для эмулятора. – Lazy

0

Для Android 4.0 (Ice Cream Sandwich), а затем мне нужно было добавить их, кроме значения landscape.

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 

Использование только keyboardHidden|orientation будет по-прежнему приводит к утечкам памяти и отдыха моей деятельности при нажатии на кнопку питания.

+0

Плохое предупреждение! Это не имеет никакого отношения к принудительной активности в ландшафтном режиме. Вам всегда необходимо реализовать хранение и воссоздание состояния вашей деятельности. Это базовые знания Android Development. Не решайте это с помощью этого хакерского исправления. Активность может быть закрыта системой, если ей требуется больше памяти. – Roel

+0

@Roel, это единственный способ предотвратить поворот активности на портфолио, например, когда вы вращаете устройство. Это предотвращает влияние этих изменений на активность. – Peterdk

+0

Извините за небольшое грубое сообщение, но я его протестировал, и у меня не все эти значения для ландшафтного режима. Когда вы добавляете все эти значения, это означает, что вы сами обрабатываете изменения в onConfigurationChanged() вместо того, чтобы активность была просто перезапущена (и вы должны это реализовать!), Но если вы закроете ландшафт, поворот не произойдет. – Roel

1

Выполнение этого кода является ошибкой IMO и даже более того, если вы поместите его в onCreate. Сделайте это в манифесте, и «система» знает ориентацию с момента запуска приложения. И этот тип мета или верхнего уровня «руководство» ДОЛЖЕН быть в манифесте. Если вы хотите доказать это сами, установите перерыв в onCreate Activity. Если вы сделаете это в коде там, он будет вызываться дважды: он запускается в портретном режиме, затем переключается на Пейзаж. Этого не происходит, если вы делаете это в манифесте.

+0

Я не согласен. Выполнение чего-либо в коде, а не через манифест, всегда является моим предпочтительным методом. Основываясь на принципе единой ответственности, манифест должен касаться только свойств, разрешений приложений и привязок API. Я фактически не согласен с тегом , присутствующим вообще в манифесте приложения, и поэтому я никогда не помещал его туда (и он отлично работает). То, как представляется деятельность, очевидно, представляет собой интерес к презентации. Ваша деятельность должна нести полную ответственность за то, как она представлена, и поэтому я обычно помещаю всю логику представления в код представления/действия. – ComeIn

5

Быстрое и простое решение для файла AndroidManifest.xml, добавьте следующее по каждому виду деятельности, который вы хотите, чтобы заставить альбомный режим:

android:screenOrientation="landscape" 
10

В манифесте:

<activity android:name=".YourActivity" 
 
android:screenOrientation="portrait" 
 
android:configChanges="orientation|screenSize">

В вашей деятельности:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
setContentView(R.layout.your_activity_layout); 
1

Это работает для Xamarin.Android. В OnCreate()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape; 
+0

Кто говорит о Xamarin.Android? – Roel

+0

@Roel Я. Могу ли я спросить, почему голосует? Вопрос не уточнил, был ли это Xamarin или нет, а у разработчиков Xamarin может быть аналогичный вопрос. – ComeIn

0

Используйте ActivityInfo (android.content.pm.ActivityInfo) в вашем OnCreate метод перед вызовом метода setLayout как этот

this.setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Смежные вопросы