Примушуйте активність Android завжди використовувати альбомний режим


144

Я використовую переглядач Android VNC на своєму HTC G1 . Але чомусь ця програма завжди знаходиться в альбомному режимі, незважаючи на те, що мій G1 знаходиться в портретному режимі. Оскільки переглядач Android VNC є відкритим кодом, я хотів би знати, яким чином можливий жорсткий код, щоб діяльність була «пейзажною». Я хотів би змінити його, щоб він відповідав орієнтації на телефон.

Відповіді:


188

Переглядаючи 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">

Це повинно змінити програму для переходу з портретного на пейзаж, коли користувач повертає пристрій.

Це може спрацювати, але може зіпсувати те, як виглядає графічний інтерфейс, залежно від того, як створено макет. Вам доведеться це врахувати. Також, залежно від того, як кодуються дії, ви можете помітити, що при зміні орієнтації екрана значення, які були заповнені у будь-які поля введення, зникають. Це також може бути вирішено.


3
Для чого саме configChangesпотрібен атрибут? Схоже, він працює на моєму телефоні без клавіатури без нього ... У яких ситуаціях орієнтація зміниться на портретну, якщо у вас є, screenOrientation="landscape"але пропустіть configChanges?
Timmmm


як змусити вбудовану діяльність на зразок бібліотеки вибору зображень системи лише в пейзажі або портреті?
Джекі

118

Ці ж дані можна встановити і в коді Java.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Інші значення в ActivityInfo дозволять вам повернути його до портрета, керованого датчиком або заблокованого. Особисто мені подобається встановити щось на Маніфесті, як було запропоновано в іншій відповіді на це питання, а потім змінити його згодом, використовуючи вищезазначений дзвінок в Android SDK, якщо є потреба.


@Yegor Не завжди. З андроїд-документів:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Чайтанья

40

У моєму OnCreate(Bundle), я взагалі роблю наступне:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
метод маніфестації в інших відповідях, схоже, не спрацював, але @anwarma ваш зробив
Anup

31

Ви можете вказати спрямованість діяльності в маніфесті. Дивіться тут .

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

24

У маніфесті:

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

У вашій діяльності:

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

11

Далі йде код, який я використовував для відображення всіх видів діяльності в альбомному режимі:

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

2
"Орієнтація" Якщо ваша програма націлена на API рівня 13 або вище, ви також повинні оголосити "screenSize"
Mina Fawzy

7

Швидке та просте рішення для файлу AndroidManifest.xml, додайте наступне для кожної діяльності, яку ви хочете примусити до ландшафтного режиму:

android:screenOrientation="landscape"

5

Це працює для Xamarin.Android. В OnCreate ()

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

4

Це воно!! Довго чекали цього виправлення.

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

Тепер Android запускає режим «Пейзаж» на старті.


3

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


я не запитувач, але, можливо, він хоче запрограмувати програмно, тому що він хоче примусити його в певний час?
Хамза Малик

1

Робити це в коді - це неправильно IMO, і тим більше, якщо ви помістите його в onCreate. Зробіть це в маніфесті, і "система" знає орієнтацію від запуску програми. І цей тип мета-чи "керівництва" найвищого рівня повинен бути в маніфесті. Якщо ви хочете довести це самостійно, встановіть перерву в діяльності «Створити». Якщо ви зробите це в коді, він буде викликаний двічі: він запускається в режимі "Портрет", а потім перемикається на "Пейзаж". Цього не відбувається, якщо ви зробите це в маніфесті.


1
Я не погоджуюсь. Робити що-небудь у коді, а не через маніфест - це завжди мій кращий метод. Виходячи з принципу єдиної відповідальності, маніфест повинен стосуватися лише властивостей, дозволів та прив'язки API на рівні програми. Я фактично не погоджуюся з тим, що тег <activity> взагалі присутній у маніфесті програми, і тому я ніколи його не поміщаю (і він чудово працює). Як презентується діяльність, очевидно, є проблемою презентації. Ваша діяльність повинна нести повну відповідальність за те, як вона представлена, тому я зазвичай вкладаю всю логіку презентації в код перегляду / діяльності.
Приходь

0

Для Android 4.0 (сендвіч з морозивом) та пізніших версій мені потрібно було додати їх, окрім landscapeзначення.

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

Використання лише keyboardHidden|orientationвсе одно призведе до витоку пам'яті та відтворення моєї діяльності при натисканні кнопки живлення.


Погана практика попередження! Це не має нічого спільного з форсуванням активності в ландшафтному режимі. Вам завжди потрібно здійснювати зберігання та відтворення стану своєї діяльності. Це основні знання Android Development. Не вирішуйте це за допомогою цього гакітного виправлення. Діяльність завжди може бути закрита системою, якщо їй потрібно більше пам’яті.
Роел

@Roel, ну це єдиний спосіб запобігти активності повертатись до портрета, наприклад, якщо ви повертаєте пристрій. Це запобігає, що ці зміни конфігурації впливають на активність.
Peterdk

Вибачте за трохи бурхливе повідомлення, але я перевірив його, і не знаю всіх цих значень для альбомного режиму. Коли ви додаєте всі ці значення, це означає, що ви самі керуєте змінами в onConfigurationChanged (), замість того, що активність буде лише перезапущена (і вам доведеться це реалізувати!), Але якщо ви змусите пейзаж, обертання не відбудеться.
Roel

Привіт, деякі з них, можливо, не потрібні, але пропускання всіх із них призведе до дивних проблем з ротацією. Я зараз не можу перевірити, але коли я розробляв додаток, який весь час повинен був знаходитись у ландшафті, використання лише цього orientation|screensizeбуло недостатньо у всіх випадках. Це автоматично повернеться до портрета.
Peterdk

Ці зміни конфігурацій також використовуються в Google Mobile Ads та інших SDK-колах оголошень. Ось звідки я їх отримав у той час.
Peterdk

0

Використовуйте ActivityInfo (android.content.pm.ActivityInfo) у своєму методі onCreate, перш ніж викликати такий метод setLayout

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


0

Додайте наступні рядки в активності

Вам потрібно входити в кожну діяльність

для ландшафту

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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.