Принудительно установить портретную ориентацию

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

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

<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);
}

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

12 ответов

Решение

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

Пример:

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

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

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

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

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

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

в вашем классе 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) {

            }
        });
}

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

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

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

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

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

import android.content.pm.ActivityInfo;

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

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

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

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

android:configChanges="orientation|screenSize"

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

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

У меня была эта строка в моем 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">

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

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

android:screenOrientation="portrait"

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

android:configChanges="orientation|keyboardHidden"

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

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

В 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}" />

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

Чтобы все ваше приложение работало в полном портретном или ландшафтном режиме, вам нужно сделать очень простую вещь.

  1. Перейдите в папку манифеста вашего приложения
  2. См. Действие, в котором определен фильтр намерений. По сути, это первое действие, которое открывается при запуске вашего приложения.
  3. Внутри этого действия добавьте android:screenOrientation="portrait"

Это заставит все ваше приложение работать в портретном режиме, или вы также можете настроить его для работы в ландшафтном режиме.

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам