Як відключити ландшафтний режим в Android?


932

Як можна відключити альбомний режим для деяких переглядів у моєму додатку Android?


3
По суті ви намагаєтесь відключити функцію автоматичного повороту. Спробуйте встановити бажану орієнтацію у портретних поданнях? http://code.google.com/android/reference/android/R.styleable.html#AndroidManifestActivity_screenOrientation
adam

Відповіді:


1631

Додайте android:screenOrientation="portrait"активність у AndroidManifest.xml. Наприклад:

<activity android:name=".SomeActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait" />

EDIT: Оскільки це стало надзвичайно популярною відповіддю, я відчуваю велику провину, оскільки примушувати портрет рідко є правильним рішенням проблем, до яких часто звертаються.
Основні застереження з вимушеним портретом:

  • Це не звільняє вас від думки про події життєвого циклу діяльності або про правильне збереження / відновлення стану. Окрім обертання додатків, є багато речей, які можуть спричинити руйнування / рекреацію, включаючи неминучі речі, такі як багатозадачність. Немає ярликів; навчитися використовувати пучки та retainInstanceфрагменти.
  • Майте на увазі, що на відміну від досить рівномірного досвіду iPhone, є деякі пристрої, де портрет не є чітко популярною орієнтацією. Коли користувачі користуються пристроями з апаратними клавіатурами або ігровими майданчиками на екрані Nvidia Shield, на Chromebook , на складаних пристроях або на Samsung DeX , примусовий портрет може зробити ваш додаток чи обмеженням, так і великим клопотом щодо зручності використання. Якщо у вашої програми немає сильного аргументу UX, який би призвів до негативного досвіду підтримки інших орієнтацій, ви, ймовірно, не повинні застосовувати пейзаж. Я говорю про такі речі, як "це додаток для касових апаратів для однієї конкретної моделі планшета, яка завжди використовується у фіксованому апаратному доку".

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

  • Якщо ваша головна проблема полягає у випадковій орієнтації, змінюється середина активності, що, на вашу думку, датчики та програмне забезпечення пристрою не справляться добре (наприклад, у грі на основі нахилу), розгляньте підтримку пейзажу та портрету, але використовуйте nosensorдля орієнтації. Це викликає краєвид на більшості планшетів і портрет на більшості телефонів, але я все одно не рекомендую це для більшості "звичайних" додатків (деякі користувачі просто люблять набирати альбомну клавіатуру на своїх телефонах, а багато користувачів планшетних ПК читають в портреті - і ви повинні дозволити їм).
  • Якщо вам все-таки потрібно змусити портрет з якихось причин, sensorPortraitможе бути краще, ніж portraitдля Android 2.3+; це дозволяє створити перевернутий портрет, що досить часто зустрічається при використанні планшетів.

54
Це можна зробити для всього додатка. Перевірте це stackoverflow.com/a/9784269/1300707
Лайам Джордж Betsworth

1
Я помітив, що є ще один портрет: sensorPortait. Яка різниця між sensorPortait і портретом?
Джекі

1
Якщо ви читаєте документи Google : "Орієнтація на портрет, але може бути нормальною або зворотною портретою на основі датчика пристрою. Додано в API рівня 9". Отже - тобто - "портрет, правою стороною догори або догори дном, лише для Android 2.3+".
Йоні Самлан

2
Як я зазначив у своїй відповіді нижче - щоб обійти декілька питань, "носовий", швидше за все, кращий варіант.
Майк Вейр

1
Треба сказати, що я не згоден. Не всі переживання сумісні з пейзажним режимом на телефонах, тому ви повинні дозволити UX приймати рішення, а не датчики. Однак це не стосується планшетів.
Ренцо Тіссоні

110

Мені не було відомо про AndroidManifest.xmlперемикач файлів, поки я не прочитав цю публікацію, тому в своїх додатках я скористався цим:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     //  Fixed Portrait orientation

9
це може змусити вашу активність стрибати при першому завантаженні, якщо пристрій не має вказаної орієнтації.
Дорі

Я використовував цей метод, я викликав його в OnCreate, тоді я читав дані з деяких файлів активів. Якби я запустив додаток із пристроєм в альбомній орієнтації, він би обертався, але це призведе до помилкового зчитування цих ініціалізаційних активів з якихось дивних причин (можливо, варто було б почекати, коли обертання закінчить якийсь спосіб). Використання альтернативи xml не викликало цієї проблеми.
Раду Сіміонеску

1
Це може бути проблемою із послідовністю запуску програм для Android. Ви можете спробувати перемістити setRequestedOrientation () на onResume () ???
Багатий

45

Додайте це android:screenOrientation="portrait"у свій файл маніфесту, де ви декларуєте свою діяльність таким чином

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

Якщо ви хочете зробити за допомогою коду Java, спробуйте

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

перш ніж зателефонувати за setContentViewметодом своєї діяльності в onCreate().

Сподіваюся, що ця допомога і легко зрозуміла для всіх ...


29

Багато відповідей тут пропонують використовувати "portrait"у файлі AndroidManifest.xml. Це може здатися хорошим рішенням, але, як зазначено в документації, ви виділяєте пристрої, які можуть мати лише пейзаж. Ви також змушуєте певні пристрої (які найкраще працюють у ландшафті) переходити в портрет, не отримуючи належної орієнтації.

Моя пропозиція - використовувати "nosensor"замість цього. Це дозволить пристрою використовувати орієнтовану орієнтацію за замовчуванням, не заблокує будь-які покупки / завантаження в Google Play і забезпечить, щоб датчик не зіпсував вашу (NDK, в моєму випадку) гру.


Оскільки багато хто проголосує за це, я хотів би зазначити, що я з тих пір перейшов до інших відповідей, які пропонують "портретировать", як деякі незрозумілі пристрої насправді реагують непередбачувано, коли хочуть здійснити поворот екрану в додатку, який став вимога пізніше для мене. Я також сумніваюся, що будь-які програми з "портретом" заблокуються будь-якими налаштуваннями Google Play.
Майк Вейр

Google Play насправді фільтрує додатки, призначені лише для портретів, на пристроях, що мають лише пейзаж, див. Примітку на цій сторінці: developer.android.com/guide/topics/manifest/… ("значення, яке ви заявляєте, дозволяє фільтрувати за такими службами, як Google Грати ")
miracle2k

14

Просто додайте Подобається цей рядок у свій Маніфест

android: screenOrientation = "портрет"

<manifest
    package="com.example.speedtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >


        <activity
            android:name="ComparisionActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
        </activity>

    </application>

</manifest>   

13

Якщо ви хочете налаштувати користувача,

то я б рекомендував setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Ви можете змінити налаштування з меню налаштувань.

Я вимагаю цього, оскільки мої таймери повинні відповідати тому, що на екрані, а обертання екрана знищить поточну активність.


9

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

Потрібно спочатку переконатися, що ви включили у свій підклас програми. У своїй програмі onCreate (), яка називається при першому запуску програми, ви реєструєте об'єкт ActivityLifecycleCallbacks (API рівня 14+) для отримання сповіщень про події життєвого циклу активності.

Це дає вам змогу виконувати власний код під час запуску будь-якої діяльності у вашому додатку (або зупинення, відновлення чи інше). У цей момент ви можете викликати setRequestedOrientation () на новостворену діяльність.

І не забудьте додати додаток: name = ". MyApp" у свій файл маніфесту.

class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();  

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            ....
        });
    }
}


7

Ви повинні змінити android:screenOrientation="sensorPortrait"в AndroidManifest.xml



6

Якщо ви не хочете краще переглядати проблеми додавання орієнтації в кожному маніфестному записі активності, створіть клас BaseActivity (успадковує 'Activity' або 'AppCompatActivity'), який буде успадковуватися кожною діяльністю вашої програми замість 'Activity "або" AppCompatActivity "та просто додайте наступний фрагмент коду у свою BaseActivity:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // rest of your code......
}


5

Якщо ви хочете відключити Landscape mode for your android app(або одну діяльність), все, що вам потрібно зробити, це додати,

android:screenOrientation="portrait"до тегу активності у AndroidManifest.xmlфайлі.

Подібно до:

<activity android:name="YourActivityName" 
    android:icon="@drawable/ic_launcher" 
    android:label="Your App Name" 
    android:screenOrientation="portrait">

Інший шлях, програмний підхід.

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Я сподіваюсь, що це допоможе вам. Для більш детальної інформації ви можете відвідати тут, введіть опис посилання тут


2
Оскільки так багато відповідей дають поради, які суперечать хорошим порадам @Phoenix та @ Yoni, я думаю, що хороший підсумок - це повторити те, що вони пропонують:android:screenOrientation="nosensor">
DSlomer64

1
@ DSlomer64 Так. Якщо ви хочете впоратися з планшетними пристроями, тоді вам слід використовувати значення "nosnsor", а не портрет
IntelliJ Amiya

5

Як змінити орієнтацію в деяких точках зору

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

Зробіть свій вид Пейзаж

OrientationUtils.lockOrientationLandscape(mActivity);

Складіть свій погляд Портрет

OrientationUtils.lockOrientationPortrait(mActivity);

Розблокувати орієнтацію

OrientationUtils.unlockOrientation(mActivity);

Орієнтаційний клас Util

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.view.Surface;
import android.view.WindowManager;

/*  * This class is used to lock orientation of android app in nay android devices 
 */

public class OrientationUtils {
    private OrientationUtils() {
    }

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

    /** Locks the device window in portrait mode. */
    public static void lockOrientationPortrait(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    /** Locks the device window in actual screen mode. */
    public static void lockOrientation(Activity activity) {
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
                .getRotation();

        // Copied from Android docs, since we don't have these values in Froyo
        // 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

        // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
        if (!(Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)) {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        } else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }

    /** Unlocks the device window in user defined screen mode. */
    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }

}

4

використання

android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" 

4

Ви повинні встановити орієнтацію кожного виду діяльності.

<activity
                android:name="com.example.SplashScreen2"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Registration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Verification"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.WelcomeAlmostDone"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.PasswordRegistration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>

4

Додати клас всередині методу oncreate ()

 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

4

Якщо ви використовуєте Xamarin C #, деякі з цих рішень не працюватимуть. Ось рішення, яке я знайшов працювати.

[Activity(MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)]

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


4

Ви можете змусити вашу конкретну діяльність завжди залишатися в портретному режимі, записавши це у свій маніфест.xml

 <activity android:name=".MainActivity"
        android:screenOrientation="portrait"></activity>

Ви також можете змусити свою діяльність залишатися в режимі обмеження, написавши наступний рядок у методі onCreate () вашої діяльності

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

3
<android . . . >
    . . .
    <manifest . . . >
        . . .
        <application>
            <activity android:name=".MyActivity" 
                android:screenOrientation="portrait" 
                android:configChanges="keyboardHidden|orientation">
            </activity>
        </application>
    </manifest>
</android>

3

Додайте нижче коментарі для свого проекту,

npm встановити

npm я реагую-native-орієнтування-шафка

тоді ви використовуєте клас маніфесту, наприклад, React_Native (папка вашого проекту) / android / app / src / main / AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

<application
  android:name=".MainApplication"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:allowBackup="false"
  android:theme="@style/AppTheme">
  <activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="landscape"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
  <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>

Дякую тобі!


2

У <apphome>/platform/androidствореному каталозі AndroidManifest.xml(копіювання з створеного). Потім додайте android:screenOrientation=" portrait" до ВСІХ елементів активності.


2
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="in.co.nurture.bajajfinserv">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>


    <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="portrait">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

ми можемо обмежити активність у портретному або пейзажному режимі, використовуючи атрибут або android: screenOrientation.

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


2

Або в маніфестному класі.

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

або програмно

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Примітка. Ви повинні зателефонувати цьому setContentViewметоду до своєї діяльності в onCreate().


2

Додайте android:screenOrientation="portrait"у файл AndroidManifest.xml .

Наприклад :

<activity android:name=".MapScreen" 
 android:screenOrientation="portrait"></activity>

1

Сподіваючись допомогти комусь іншому, наступним атрибутом ACTIVITY в AndroidManifest.xml є все, що вам потрібно:

android: configChanges = "орієнтація"

Отже, повний вузол активності:

<activity android:name="Activity1" 
    android:icon="@drawable/icon" 
    android:label="App Name" 
    android:configChanges="orientation">

Залишилося стільки відповідей, ви повинні надати більше інформації, чому варто використовувати вашу. Особливо документи говорять, що не використовують цю опцію: "Примітка. Використовувати цей атрибут слід уникати та використовувати лише в крайньому випадку. Будь ласка, прочитайте Зміни режиму виконання, щоб отримати докладнішу інформацію про те, як правильно обробити перезапуск через зміну конфігурації." developer.android.com/guide/topics/manifest/…
Мурмель

1

У котліні ж це можна програмно досягти, використовуючи нижче

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

1

Це працювало для мене. Спробуйте додати цей код у файл AndroidManifest

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme">
        ....
        ....
        </application>

Я був би чудовим рішенням, оскільки вам не доведеться встановлювати за діяльність. На жаль, у моєму додатку не працює.
Мирослав Колодій

1

Вкладіть це у свій маніфест.

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="sensorPortrait" />

Орієнтація буде портретною, але якщо телефон користувача перевернутий, він також показує правильний шлях. (Так ваш екран буде обертатися на 180 градусів).


Система ігнорує цей атрибут, якщо активність виконується в режимі з кількома вікнами .


0

якщо ваша діяльність пов’язана з першим станом орієнтації пристрою, отримайте поточну орієнтацію пристрою в onCreateметоді та потім виправити це назавжди:

        int deviceRotation = ((WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();

        if(deviceRotation == Surface.ROTATION_0) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_180)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_90)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        else if(deviceRotation == Surface.ROTATION_270)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.