Принудительный «портретный» режим ориентации


298

Я пытаюсь включить режим «портрет» для своего приложения, потому что мое приложение абсолютно не предназначено для «ландшафтного» режима.

Прочитав некоторые форумы, я добавил эти строки в свой файл манифеста:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

Но это не работает на моем устройстве (HTC Desire). Он переключается с «портрет» на «пейзаж», игнорируя строки из файла манифеста.

После дополнительного чтения форумов я попытался добавить это в свой файл манифеста:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

и эта функция в моем классе деятельности:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Но опять не повезло.

Ответы:


531

Не применяйте ориентацию к приложения элемента, вместо этого вы должны применить атрибут к активности элемента, и вы должны также установить , configChangesкак указано ниже.

Пример:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

Это применяется в файле манифеста AndroidManifest.xml.


26
Для чего нужны configChanges?
Дрор

71
@Orchestrator, configChanges означает, что изменение конфигурации обрабатывается самим действием. Без этого действие будет возобновлено, если произойдет изменение ориентации. Вы могли бы спросить, если бы вы указали, что ориентация «портретная», как бы она изменилась? Это может измениться, если вы запустите другое действие, которое изменяет ориентацию, затем это новое действие завершится, и вы вернетесь к своему заданию. Например, намерение захвата изображения по умолчанию на Samsung Galaxy S3 делает это в определенных ориентациях.
Гордон МакКрейт

2
@GordonMcCreight, не могли бы вы объяснить это реальным примером: «Вы могли бы спросить, если вы указали, что ориентация« портретная », как бы она изменилась? новая активность завершается, возвращая вас обратно к вашей деятельности. "
Тушар Пандей

3
Конечно, @TusharPandey. Если я правильно помню, единственное место, которое вызвало у нас горе, было то, когда наша деятельность запустила намерение захвата изображения по умолчанию на Samsung Galaxy S3. По сути, мы просто хотели сфотографироваться и получить результаты. Однако, когда намерение камеры вернулось, это вызвало изменение ориентации, которое стерло состояние в нашей деятельности, так как мы не верили, что должны были защищать от этого (учитывая, что все наше приложение всегда было только в «портретной» ориентации). Как и почему Galaxy S3 делает это за пределами моего (по общему признанию) понимания.
Гордон МакКрейт

8
Почему "клавиатура скрыта"?
гонзобрены

24

Обратите внимание, что

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

добавляется в файл манифеста - где определяется активность.


13

Я думаю, что android:screenOrientation="portrait"могут быть использованы для отдельных видов деятельности. Так что используйте этот атрибут в <activity>теге как:

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

13

Если у вас много активности, как у меня, в вашем приложении или если вы не хотите вводить код для каждого тега активности в манифесте, вы можете сделать это.

в вашем классе Application Base вы получите обратный вызов жизненного цикла

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

public class MyApplication extends Application{

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

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

надеюсь, это поможет.


1
Эффективный ответ! это должен быть правильный ответ, особенно для тех, кто разрабатывает сложные приложения, которые сильно зависят от большого количества действий.
ФЕБРИАН АСА ПЕРДАНА

10

Установить принудительный портретный или альбомный режим , Добавьте линии соответственно.

Импортировать ниже строки:

import android.content.pm.ActivityInfo;

Добавить ниже линии чуть выше setContentView(R.layout.activity_main);

Для портрета :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Для Ландшафта :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Это определенно будет работать.


1
Это не работает с Android 9 на некоторых устройствах - переход вращения экрана виден на короткое время, даже если вы используете только ПОРТРЕТ
Игорь Войда

Можете ли вы указать информацию об устройстве, в котором вы сталкивались с этим, если это возможно
Parth Patel

4

Согласно документации Android, вы также должны часто включать screenSizeв качестве возможного изменения конфигурации.

android:configChanges="orientation|screenSize"

Если ваше приложение предназначено для уровня API 13 или выше (как объявлено атрибутами minSdkVersion и targetSdkVersion), вам также следует объявить конфигурацию «screenSize», поскольку она также изменяется, когда устройство переключается между книжной и альбомной ориентациями.

Кроме того , если вы все включают значение keyboardHiddenв ваших примерах, если не вы , то также рассмотреть locale, mcc, fontScale, keyboardи другие? ..


3

У меня была эта строка в моем AndroidManifest.xml

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Который я изменил (только добавил android:screenOrientation="portrait" )

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Это исправило вещи для меня.


2

Что-то для дополнения: я недавно обновил приложение, предыдущее работало в альбомном и портретном режиме, и я хочу, чтобы обновленная версия работала в портретном режиме, поэтому я добавил

android:screenOrientation="portrait"

к соответствующей деятельности, и он просто потерпел крах, когда я тестировал обновление. Потом я добавил

android:configChanges="orientation|keyboardHidden"

тоже, и это работает.


1
Если это не ответ на вопрос, возможно, добавьте его, поскольку комментарий поможет.
JPReddy

Убедитесь, что вы добавили его в действие, а не для блока приложения
Waran-

1

Я думаю, что вы хотите добавить android:configChanges="orientation|keyboardHidden"в свою деятельность? В противном случае действие перезапускается при изменении конфигурации. Тогда onConfigurationChangedбы не называли, толькоonCreate


1

Если вы хотите поддерживать разные ориентации debugи releaseсборки, напишите об этом (см. Https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest ).

В build.gradleвашей appпапке напишите:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

Тогда AndroidManifestвы можете использовать эту переменную «ориентация» в любом Activity:

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

Вы можете добавить android:configChanges:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]в отладке и manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]в выпуске,

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />

-8

Краткий ответ: не делай этого.

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

Причина довольно проста. Вы хотите, чтобы ваше приложение было доступно максимально широкой аудитории на максимально возможном количестве различных устройств. Устанавливая определенную ориентацию экрана, вы не позволяете приложению запускаться (удобно) на устройствах, которые не поддерживают эту ориентацию, и вы расстраиваете и отталкиваете потенциальных клиентов, которые предпочитают другую ориентацию.

Пример: вы разрабатываете свое приложение для включения портретного режима. Клиент загружает приложение на устройство 2-в-1, которое они используют преимущественно в альбомном режиме.
Последствие 1. Ваше приложение непригодно для использования или ваш клиент вынужден отстыковывать свое устройство, поворачивать его и использовать в незнакомой или неудобной для него ориентации.
Следствие 2. Клиент разочарован неинтуитивным дизайном вашего приложения и находит альтернативу или полностью отказывается от приложения.

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

Вы не хотите, чтобы ваши клиенты ненавидели ваше приложение.


Я знаю, что это не дает прямого ответа на вопрос, поэтому я хочу объяснить это немного подробнее для тех, кому интересно.

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

Вопрос действительно заключается в том, должен ли я заблокировать ориентацию экрана в моем приложении? Аскер выбрал дизайн интерфейса, чтобы он функционировал и выглядел хорошо только в портретном режиме. Я подозреваю, что это сэкономило время на разработку или потому, что рабочий процесс приложения особенно благоприятен для портретного макета (обычного для мобильных игр). Но эти причины игнорируют все действительно важные факторы, которые мотивируют правильный дизайн.

  1. Взаимодействие с клиентами - вы хотите, чтобы ваши клиенты чувствовали себя втянутыми в ваше приложение, а не выталкиваемыми из него. Приложение должно плавно переходить от того, чем занимался ваш клиент до открытия приложения. (По этой причине большинство платформ имеют согласованные принципы проектирования, поэтому большинство приложений выглядят более или менее одинаково, хотя и не обязаны).

  2. Отзывы клиентов - вы хотите, чтобы ваши клиенты положительно реагировали на ваше приложение. Они должны наслаждаться этим. Даже если это приложение для начисления заработной платы за работу, им должно быть приятно открыть его и посмотреть на него. Приложение должно сэкономить время ваших клиентов и уменьшить разочарование по поводу альтернатив. (Приложения, которые раздражают пользователей, вызывают недовольство вашим приложением, которое перерастает в недовольство вашим брендом.)

  3. Конверсия клиентов - вы хотите, чтобы ваши клиенты могли быстро и легко переходить от просмотра к взаимодействию. Это конечная цель любого приложения - преобразовать показы в доход. (Приложения, которые не приносят доход, являются пустой тратой вашего времени на создание с точки зрения бизнеса.)

Плохо разработанный пользовательский интерфейс снижает вовлеченность клиентов и реагирование, что в конечном итоге приводит к снижению доходов. В мире, ориентированном на мобильные устройства (и особенно на тему режимов портретной и альбомной ориентации), это объясняет, почему адаптивный веб-дизайн так важен. Walmart Canada представила адаптивный дизайн на своем сайте в ноябре 2013 года и увидела 20% увеличение конверсии клиентов. O'Neill Clothing внедрила адаптивный веб-дизайн, и выручка от клиентов, использующих устройства iOS, увеличилась на 101,25% , а для клиентов, использующих устройства Android , - на 591,42% .

Существует также тенденция разработчиков сосредоточиться на реализации конкретного решения (например, блокировка ориентации экрана), и большинство разработчиков на этом сайте будут очень рады помочь реализовать это решение, не задаваясь вопросом, является ли это даже лучшим Решение проблемы.

Блокировка ориентации экрана - это дизайн пользовательского интерфейса, эквивалентный реализации цикла do-while. Вы действительно уверены, что хотите сделать это таким образом, или есть лучшая альтернатива?

Не заставляйте ваше приложение в режиме одного дисплея. Вложите дополнительное время и усилия, чтобы сделать его отзывчивым.


2
Я понимаю и согласен с вами в том, что это плохо спроектированный интерфейс. Но это не меняет того факта, что вам МОЖЕТ НУЖНО это сделать, и, тем не менее, фреймворк должен иметь эти возможности в целом. Вы никогда не знаете, какими будут будущие приложения и что нужно делать, поэтому вопрос остается в силе.
З. Хулла,

1
Вы не ошиблись. Я думаю, что мой ответ был частично вызван разочарованием, которое я испытал из-за нескольких приложений, которые делают это без необходимости, и это полностью разрушает опыт. Я скажу, что количество законных случаев блокировки режима отображения бесконечно мало (и все же выполнимо и предпочтительно, но не в рамках бюджета). Это напоминает о других проблемах; благодаря тому, что кодирование стало таким же простым, как и сейчас, многие любители-разработчики пишут приложения, потому что они знают код, но не изучают, как создавать пользовательский интерфейс или проектировать, или даже базовые рекомендации (приложения Java, которые устанавливаются в \ AppData - EWWWW).
Томас

1
Я создаю приложение VR. Ориентация ДОЛЖНА БЫТЬ пейзажной, чтобы очки могли творить чудеса. Это один из примеров пользовательского интерфейса, который не может работать как в портретной, так и в альбомной ориентации. Игры также могут принуждать к определенной ориентации. Бьюсь об заклад, есть множество законных дел.
Raslanove

1
Хотя StackExchange существует для ответов на конкретные вопросы, ответы должны быть написаны так, чтобы они применялись как можно более широко, чтобы эти ответы были полезны для других. Разработка - это гораздо больше, чем просто написание кода, и причина, по которой в мире так много ненужных приложений, заключается в том, что многие разработчики забывают - или никогда не учат - этот важный принцип. Я бы лично добавил, что если вы делаете VR на телефоне, вы делаете VR неправильно, но стоимость подтолкнула спрос на VR на платформах, которые никогда не должны его поддерживать.
Томас,

1
Я не согласен с этим ответом, но он отвечает на вопрос, который не был задан.
Движение
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.