Как отключить ландшафтный режим в Android?


933

Как отключить ландшафтный режим для некоторых видов в моем приложении для Android?


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

Ответы:


1633

Добавьте android:screenOrientation="portrait"к активности в AndroidManifest.xml. Например:

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

РЕДАКТИРОВАТЬ: Поскольку это стало очень популярным ответом, я чувствую себя очень виноватым, так как принуждение к портрету редко является правильным решением проблем, к которым он часто применяется.
Основные предостережения с вынужденным портретом:

  • Это не освобождает вас от необходимости думать о событиях жизненного цикла активности или надлежащего сохранения / восстановления состояния. Помимо ротации приложений существует множество вещей, которые могут вызвать разрушение / восстановление активности, включая такие неизбежные вещи, как многозадачность. Там нет ярлыков; научиться использовать связки и retainInstanceфрагменты.
  • Имейте в виду, что в отличие от довольно однородного восприятия iPhone, есть некоторые устройства, где портрет не является явно популярной ориентацией. Когда пользователи работают на устройствах с аппаратными клавиатурами или игровыми площадками, такими как Nvidia Shield, на Chromebook , на складных устройствах или на Samsung DeX , принудительный портрет может сделать ваше приложение либо ограничивающим, либо огромным неудобством в использовании. Если в вашем приложении нет сильных аргументов UX, которые могут привести к негативным последствиям для поддержки других ориентаций, вам, вероятно, не стоит форсировать ландшафт. Я говорю о таких вещах, как «это кассовое приложение для одной конкретной модели планшета, которое всегда используется в стационарной аппаратной док-станции».

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

  • Если ваша основная проблема заключается в случайных изменениях ориентации в середине активности, то, по вашему мнению, датчики и программное обеспечение устройства не справятся (например, в игре на основе наклона), подумайте о поддержке пейзажа и портрета, но используйте nosensorдля ориентации. Это заставляет пейзаж на большинстве планшетов и портрет на большинстве телефонов, но я все равно не рекомендовал бы это для большинства «обычных» приложений (некоторые пользователи просто любят набирать текстовую клавиатуру на своих телефонах, а многие пользователи планшетов читают в портретном режиме - и вы должны позволить им).
  • Если вам по какой-то причине все равно нужно принудительно установить портрет, sensorPortraitможет быть лучше, чем portraitдля Android 2.3+; это позволяет перевернуть портрет, что довольно часто встречается при использовании планшета.

54
Это можно сделать для всего приложения. Проверьте это stackoverflow.com/a/9784269/1300707
Лиам Джордж Бетсворт

1
Я заметил, что есть еще один портрет: сенсорный порт. В чем разница между сенсорным портретом и портретом Jack
Джеки,

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»). Play ")
miracle2k

14

Если вы хотите пользовательские настройки,

тогда я бы порекомендовал setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Вы можете изменить настройки из меню настроек.

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


14

Просто добавьте лайк в своем манифесте

андроид: 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>   

9

Вы можете сделать это для всего приложения без необходимости расширять общий базовый класс.

Сначала нужно убедиться, что вы включили подкласс Application в свой проект. В его onCreate (), вызываемом при первом запуске приложения, вы регистрируете объект ActivityLifecycleCallbacks (уровень API 14+) для получения уведомлений о событиях жизненного цикла активности.

Это дает вам возможность выполнять свой собственный код всякий раз, когда какая-либо активность в вашем приложении запускается (или останавливается, или возобновляется, или как угодно). В этот момент вы можете вызвать setRequestedOrientation () для вновь созданного действия.

И не забудьте добавить app: 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);
            }
            ....
        });
    }
}




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

Добавьте android:screenOrientation="portrait"к активности вы хотите отключить ландшафтный режим.


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 Да. Если вы хотите справиться с планшетными устройствами, то вам следует использовать значение nosensor вместо портретного
IntelliJ Amiya

5

Как изменить ориентацию в некоторых видах

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

Сделайте ваш взгляд Пейзаж

OrientationUtils.lockOrientationLandscape(mActivity);

Сделай свой взгляд Портрет

OrientationUtils.lockOrientationPortrait(mActivity);

Разблокировать ориентацию

OrientationUtils.unlockOrientation(mActivity);

Ориентация Util Class

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

Вы можете заставить свою конкретную деятельность всегда оставаться в портретном режиме, написав это в своем manifest.xml

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

Вы также можете заставить свою активность оставаться в режиме postrait, написав следующую строку в методе 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

нпм я реагирую-родной-ориентация-шкафчик

затем вы используете класс манифеста, например, 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/...
Murmel

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.