Примусовий режим орієнтації «портрет»


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
Для чого потрібні конфігураційні зміни?
Dror

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 ви отримаєте зворотний виклик життєвого циклу

тому в основному те, що відбувається для кожної діяльності при створенні on 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) {

            }
        });
}

Я сподіваюся, що це допомагає.


1
Ефективна відповідь! це має бути правильною відповіддю, особливо для тих, хто розробляє складні програми, які сильно залежать від великої кількості діяльності.
FEBRYAN ASA PERDANA

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 на деяких пристроях - перехід обертання екрана видно на короткий момент, навіть якщо ви використовуєте лише PORTRAIT
Ігор

Чи можете ви, будь-ласка, вказати інформацію про пристрій, з якою ви стикаєтесь, якщо це можливо
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

Переконайтеся, що ви додали його до активності не для блоку додатків
Варан

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. Конверсія клієнтів - ви хочете, щоб ваші клієнти могли швидко і легко переходити від перегляду до взаємодіючих. Це кінцева мета будь-якої програми - перетворити покази на прибуток. (Програми, які не приносять доходу, - це марна трата часу на створення, з точки зору бізнесу.)

Неправильно розроблений інтерфейс зменшує залучення клієнтів та реакцію, що в кінцевому рахунку призводить до зниження доходу. У світі, орієнтованому на мобільні пристрої (особливо на тему портретних / пейзажних режимів відображення), це пояснює, чому адаптивний веб-дизайн - така велика справа. У листопаді 2013 року компанія Walmart Canada представила чуйний дизайн на своєму веб-сайті та побачила 20% збільшення конверсії клієнтів. О'Нілл Одяг, реалізований чуйним веб-дизайном, а дохід від клієнтів, що користуються пристроями iOS, збільшився на 101,25% , а 591,42% - від клієнтів, що використовують пристрої Android .

Також існує тенденція, щоб розробники ретельно фокусувались на впровадженні конкретного рішення (наприклад, блокування орієнтації на дисплей), і більшість розробників на цьому веб-сайті будуть надто раді допомогти реалізувати це рішення, не ставлячи під сумнів, чи це навіть найкраще вирішення проблеми.

Блокування орієнтації екрана є еквівалентом дизайну інтерфейсу користувача, що реалізує цикл "час роботи". Ти справді? впевнені, що хочете зробити це саме так, чи є краща альтернатива?

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


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

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

1
Я будую додаток VR. Орієнтація ОБОВ'ЯЗКОВО БУДЬ пейзажна для окулярів, щоб зробити свою магію. Це один із прикладів інтерфейсу користувача, який не може бути розроблений як для портретного, так і для пейзажу. Ігри також можуть мати певну орієнтацію. Надіюсь, є багато законних справ.
Расланове

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

1
Я не згоден з цією відповіддю, але він відповідає на запитання, яке не було задано.
bmovement
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.