Режим ориентации "портрет"

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

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

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

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

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

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

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

Ответ 1

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

Пример:

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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) {

            }
        });
}

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

Ответ 5

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

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

import android.content.pm.ActivityInfo;

Добавьте setContentView(R.layout.activity_main); строку чуть выше setContentView(R.layout.activity_main);

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

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

Ответ 6

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

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

Ответ 7

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

android:screenOrientation="portrait"

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

android:configChanges="orientation|keyboardHidden"

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

Ответ 8

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

Ответ 9

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

android:configChanges="orientation|screenSize"

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

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

Ответ 10

Если вы хотите поддерживать разные ориентации в сборках 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}" />

Ответ 11

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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