Заставить активность Android всегда использовать альбомный режим
Я использую программу просмотра Android VNC на своем HTC G1. Но по какой-то причине это приложение всегда находится в ландшафтном режиме, несмотря на то, что мой G1 находится в портретном режиме. Поскольку средство просмотра VNC для Android имеет открытый исходный код, я хотел бы знать, как можно жестко кодировать действие, чтобы оно было "пейзажным". Я хотел бы изменить его, чтобы уважать ориентацию телефона.
14 ответов
Глядя на AndroidManifest.xml ( ссылка), строка 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">
Это должно изменить программу для переключения из портретной в альбомную, когда пользователь поворачивает устройство.
Это может работать, но может испортить внешний вид графического интерфейса в зависимости от того, как был создан макет. Вам придется учитывать это. Кроме того, в зависимости от того, как кодируются действия, вы можете заметить, что при изменении ориентации экрана значения, заполненные в любых полях ввода, исчезают. Это также, возможно, должно быть обработано.
Вы можете установить те же данные в своем коде Java, а также.
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Другие значения в ActivityInfo позволят вам установить его обратно на сенсорный или заблокированный портрет. Лично мне нравится устанавливать это значение в Манифесте, как предлагается в другом ответе на этот вопрос, а затем изменить его позже, используя вышеуказанный вызов в Android SDK, если есть необходимость.
В моем OnCreate(Bundle)
Я обычно делаю следующее:
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Вы можете указать ориентацию действия в манифесте. Смотрите здесь.
<activity android:allowTaskReparenting=["true" | "false"]
...
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
...
"adjustResize", "adjustPan"] >
В манифесте:
<activity android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">
В вашей деятельности:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);
Ниже приведен код, который я использовал для отображения всей активности в ландшафтном режиме:
<activity android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden"
android:name="abcActivty"/>
Быстрое и простое решение для файла AndroidManifest.xml: добавьте следующее для каждого действия, которое вы хотите перевести в альбомный режим:
android:screenOrientation="landscape"
Это работает для Xamarin.Android. В OnCreate()
RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;
Это оно!! Долго ждал этого исправления.
У меня есть старая проблема с Android о двойном запуске действия, которое требовало (программно) ландшафтного режима: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
Теперь Android запускает ландшафтный режим при запуске.
Арслан, почему ты хочешь форсировать ориентацию программно, хотя в манифесте уже есть путь <activity android:name=".youractivityName" android:screenOrientation="portrait" />
Добавить в действие следующие строки
Вам нужно войти в каждое действие
для пейзажа
android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"
для портрета
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"
Вот пример MainActivity
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.thcb.app">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity2"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Делать это в коде - это ИМО неправильно, и тем более, если вы помещаете это в onCreate. Сделайте это в манифесте, и "система" узнает ориентацию при запуске приложения. И этот тип мета или "руководства" верхнего уровня ДОЛЖЕН быть в манифесте. Если вы хотите доказать это себе, установите перерыв в onCreate. Если вы сделаете это в коде, он будет вызван дважды: он запускается в портретном режиме, а затем переключается в альбомный режим. Этого не произойдет, если вы сделаете это в манифесте.
Используйте только
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"
Для Android 4.0 (Ice Cream Sandwich) и более поздних версий мне нужно было добавить их, кроме landscape
значение.
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
Используя только keyboardHidden|orientation
все равно приведет к утечке памяти и восстановлению моих действий при нажатии кнопки питания.
Используйте ActivityInfo (android.content.pm.ActivityInfo) в вашем методе onCreate перед вызовом метода setLayout, как этот
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);