Отключить ландшафтный режим в Android? - PullRequest
877 голосов
/ 24 февраля 2009

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

Ответы [ 32 ]

1523 голосов
/ 24 февраля 2009

Добавьте 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+; это позволяет перевернуть портрет, что довольно часто встречается в планшетах.
102 голосов
/ 18 октября 2010

Я не знал о переключателе файлов AndroidManifest.xml до прочтения этого поста, поэтому в своих приложениях я использовал это вместо:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     //  Fixed Portrait orientation
39 голосов
/ 27 сентября 2012

Добавьте это android:screenOrientation="portrait" в свой файл манифеста, где вы объявите свою деятельность следующим образом

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

Если вы хотите использовать Java-код, попробуйте

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

перед вызовом setContentView метода для вашей активности в onCreate().

Надеюсь, это поможет и легко понятно для всех ...

25 голосов
/ 21 августа 2013

Многие ответы здесь предлагают использовать "portrait" в вашем файле AndroidManifest.xml. Это может показаться хорошим решением, но, как отмечено в документации, вы выделяете устройства, которые могут иметь только ландшафт. Вы также заставляете определенные устройства (которые лучше всего работают в альбомной ориентации) переходить в портретную ориентацию, не получая правильной ориентации.

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

11 голосов
/ 10 февраля 2012

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

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

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

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

9 голосов
/ 05 февраля 2015

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

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

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

    <uses-sdk
        android:minSdkVersion="8" />

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

        <activity
            android:name="MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

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

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

    </application>

</manifest>   
7 голосов
/ 06 мая 2015

Используйте это в onCreate () Действия

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
6 голосов
/ 03 января 2014

вы должны изменить android:screenOrientation="sensorPortait" в AndroidManifest.xml

6 голосов
/ 22 апреля 2017

Если вы не хотите проходить процедуру добавления ориентации в каждой записи манифеста лучше, создайте класс 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......
}
6 голосов
/ 01 октября 2013

Просто добавьте этот атрибут в тег активности.

 android:screenOrientation="portrait"
...