Принудительный «портретный» режим ориентации - PullRequest
275 голосов
/ 03 февраля 2011

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

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

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

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

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

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

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

Ответы [ 11 ]

504 голосов
/ 03 февраля 2011

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

Пример:

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

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

22 голосов
/ 25 мая 2013

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

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

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

12 голосов
/ 03 февраля 2011

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

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>
9 голосов
/ 14 ноября 2015

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

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

, поэтому в основном происходит то, что происходит для каждого действия при создании при создании в 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) {

            }
        });
}

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

6 голосов
/ 31 мая 2018

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

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

import android.content.pm.ActivityInfo;

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

Для Портрет :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Это точно сработает.

3 голосов
/ 29 июля 2014

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

android:configChanges="orientation|screenSize"

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

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

3 голосов
/ 21 января 2014

У меня была эта строка в моем 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 голосов
/ 24 июня 2014

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

android:screenOrientation="portrait"

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

android:configChanges="orientation|keyboardHidden"

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

1 голос
/ 12 декабря 2018

Если вы хотите поддерживать разные ориентации в 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}" />
1 голос
/ 03 февраля 2011

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

...