Заставить активность 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);

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

Другие вопросы по тегам