Вопрос

Как отключить альбомный режим для некоторых представлений в моем приложении для Android?

Это было полезно?

Решение

Добавлять android:screenOrientation="portrait" к действию в AndroidManifest.xml.Например:

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

РЕДАКТИРОВАТЬ:Поскольку этот ответ стал очень популярным, я чувствую себя очень виноватым, поскольку принудительный портрет редко является правильным решением проблем, к которым он часто применяется.
Основные предостережения при принудительном портрете:

  • Это не освобождает вас от необходимости думать о событиях жизненного цикла деятельности или должным образом сохранения/восстановления состояния.Помимо ротации приложений, есть много вещей, которые могут вызвать разрушение/отдых деятельности, включая неизбежные вещи, такие как многозадачность.Нет ярлыков;научитесь использовать пакеты и retainInstance фрагменты.
  • Имейте в виду, что в отличие от довольно единообразного интерфейса iPhone, на некоторых устройствах портретная ориентация не является явно популярной.Когда пользователи используют устройства с аппаратной клавиатурой или геймпадом типа Nvidia Shield, Хромбуки, на складные, или на Самсунг ДеХ, принудительное использование портрета может либо ограничить работу вашего приложения, либо создать огромные проблемы с его использованием.Если у вашего приложения нет веских аргументов в отношении UX, которые могли бы привести к негативному опыту поддержки других ориентаций, вам, вероятно, не следует навязывать ландшафт.Я говорю о таких вещах, как «это кассовое приложение для одной конкретной модели планшета, которое всегда используется в стационарной аппаратной док-станции».

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

  • Если вас больше всего беспокоит случайное изменение ориентации во время активности, с которым, по вашему мнению, датчики и программное обеспечение устройства не справятся (например, в игре с наклоном), рассмотрите возможность поддержки альбомной и портретной ориентации, но с использованием nosensor для ориентации.Это приводит к тому, что на большинстве планшетов используется альбомная ориентация, а на большинстве телефонов — книжная, но я все же не рекомендовал бы это для большинства «обычных» приложений (некоторым пользователям просто нравится печатать на программной клавиатуре с альбомной ориентацией на своих телефонах, а многие пользователи планшетов читают в книжной ориентации — и вы должны им это позволить).
  • Если вы все еще по какой-то причине нужно заставить портрет, sensorPortrait может быть лучше, чем portrait для Андроид 2.3+;это позволяет создавать перевернутый портрет, что довольно часто встречается при использовании планшетов.

Другие советы

Я не знал о AndroidManifest.xml переключите файл, пока не прочитаете этот пост, поэтому в своих приложениях я вместо этого использовал это:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     //  Fixed Portrait orientation

Добавь это android:screenOrientation="portrait" в вашем файле манифеста, где вы объявляете свою деятельность следующим образом

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

Если вы хотите использовать Java-код, попробуйте

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

прежде чем позвонить setContentView метод для вашей деятельности в onCreate().

Надеюсь, что эта помощь и легко понятна для всех...

Многие ответы здесь предлагают использовать "portrait" в файле AndroidManifest.xml.Это может показаться хорошим решением, но, как отмечено в документации, вы выделяете устройства, которые могут иметь только ландшафт.Вы также заставляете некоторые устройства (которые лучше всего работают в альбомной ориентации) переходить в книжную ориентацию, не получая правильной ориентации.

Мое предложение - использовать "nosensor" вместо.Это позволит устройству использовать предпочтительную ориентацию по умолчанию, не будет блокировать любые покупки/загрузки в Google Play и гарантирует, что датчик не испортит вашу (в моем случае NDK) игру.

Если вам нужны пользовательские настройки,

тогда я бы порекомендовал setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Вы можете изменить настройки из меню настроек.

Мне это нужно, потому что мои таймеры должны соответствовать тому, что на экране, а вращение экрана уничтожит текущую активность.

Просто добавьте такую ​​строку в свой манифест

Android:screenOrientation="портрет"

<manifest
    package="com.example.speedtestmeter"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name="MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name="ComparisionActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
        </activity>

        <activity
            android:name="GaugeView"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
        </activity>

        <activity
            android:name="Resultactivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
        </activity>

    </application>

</manifest>   

Используйте это в onCreate() действия.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Просто добавьте этот атрибут в тег активности.

 android:screenOrientation="portrait"

Если вы не хотите лучше добавлять ориентацию в каждую запись манифеста активности, создайте класс BaseActivity (наследует «Activity» или «AppCompatActivity»), который будет наследоваться каждым действием вашего приложения вместо «Activity». ' или 'AppCompatActivity' и просто добавьте следующий фрагмент кода в свою BaseActivity:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // rest of your code......
}

Вы должны изменить android:screenOrientation="sensorPortrait" в AndroidManifest.xml

Добавлять android:screenOrientation="portrait" к действию, для которого вы хотите отключить ландшафтный режим.

Если вы хотите отключить Landscape mode for your android app (или одно действие) все, что вам нужно сделать, это добавить,

android:screenOrientation="portrait" к тегу активности в AndroidManifest.xml файл.

Нравиться:

<activity android:name="YourActivityName" 
    android:icon="@drawable/ic_launcher" 
    android:label="Your App Name" 
    android:screenOrientation="portrait">

Другой способ, программный подход.

Если вы хотите сделать это программно, т.е.с использованием Java-кода.Вы можете сделать это, добавив приведенный ниже код в класс Java действия, которое вы не хотите отображать в альбомном режиме.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

Как изменить ориентацию в некоторых видах

Вместо блокировки ориентации всей активности вы можете использовать этот класс для прагматической динамической блокировки ориентации любого вашего представления:

Сделайте свой взгляд Пейзаж

OrientationUtils.lockOrientationLandscape(mActivity);

Сделайте свой взгляд Портрет

OrientationUtils.lockOrientationPortrait(mActivity);

Разблокировать Ориентация

OrientationUtils.unlockOrientation(mActivity);

Класс ориентации

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.view.Surface;
import android.view.WindowManager;

/*  * This class is used to lock orientation of android app in nay android devices 
 */

public class OrientationUtils {
    private OrientationUtils() {
    }

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

    /** Locks the device window in portrait mode. */
    public static void lockOrientationPortrait(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    /** Locks the device window in actual screen mode. */
    public static void lockOrientation(Activity activity) {
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
                .getRotation();

        // Copied from Android docs, since we don't have these values in Froyo
        // 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

        // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
        if (!(Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)) {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        } else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }

    /** Unlocks the device window in user defined screen mode. */
    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }

}

использовать

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

Вы должны установить направленность каждого действия.

<activity
                android:name="com.example.SplashScreen2"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Registration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Verification"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.WelcomeAlmostDone"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.PasswordRegistration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>

добавить класс внутри метода oncreate()

 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Если вы используете Ксамарин C# некоторые из этих решений не будут работать.Вот решение, которое я нашел для работы.

[Activity(MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)]

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

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

 <activity android:name=".MainActivity"
        android:screenOrientation="portrait"></activity>

Вы также можете заставить свою активность оставаться в режиме postrait, написав следующую строку в методе onCreate() вашей активности.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}
<android . . . >
    . . .
    <manifest . . . >
        . . .
        <application>
            <activity android:name=".MyActivity" 
                android:screenOrientation="portrait" 
                android:configChanges="keyboardHidden|orientation">
            </activity>
        </application>
    </manifest>
</android>

Вы можете сделать это для всего приложения без необходимости расширять все ваши действия общим базовым классом.

Хитрость заключается в том, чтобы сначала убедиться, что вы включили в свой проект подкласс Application.В методе onCreate(), вызываемом при первом запуске вашего приложения, вы регистрируете объект ActivityLifecycleCallbacks (уровень API 14+) для получения уведомлений о событиях жизненного цикла активности.

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

И не забудьте добавить app:name=".MyApp" в файл манифеста.

class MyApp extends Application {

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

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            ....
        });
    }
}

в <apphome>/platform/android каталог создан AndroidManifest.xml (копируя его из сгенерированного).Затем добавьте android:screenOrientation="portrait" ко ВСЕМ элементам деятельности.

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="in.co.nurture.bajajfinserv">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>


    <application

        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity" android:screenOrientation="portrait">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

мы можем ограничить активность в портретном или альбомном режиме, используя атрибут или android:screenOrientation.

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

Добавлять android:screenOrientation="portrait" в AndroidManifest.xml файл.

Например :

<activity android:name=".MapScreen" 
 android:screenOrientation="portrait"></activity>

Добавьте ниже комментарий к вашему проекту,

установка npm

npm я реагирую на родной шкафчик ориентации

тогда вы используете класс манифеста, например,React_Native (папка вашего проекта)/ Android/приложение/src/main/AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

<application
  android:name=".MainApplication"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:allowBackup="false"
  android:theme="@style/AppTheme">
  <activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="landscape"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
  <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>

Спасибо!

В Котлине того же можно добиться программно, используя ниже

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

У меня это сработало. Попробуйте добавить этот код в файл AndroidManifest.

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme">
        ....
        ....
        </application>

Либо в классе манифеста.

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

или программно

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Примечание : тебе следует позвонить сюда раньше setContentView метод для вашей деятельности в onCreate().

В надежде помочь кому-то еще, все, что вам нужно, — это следующий атрибут ACTIVITY в AndroidManifest.xml:

Android:configChanges="ориентация"

Итак, полный узел активности:

<activity android:name="Activity1" 
    android:icon="@drawable/icon" 
    android:label="App Name" 
    android:configChanges="orientation">

Если ваши действия связаны с первым состоянием ориентации устройства, получите текущую ориентацию устройства в onCreate метод, а затем исправить его навсегда:

        int deviceRotation = ((WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();

        if(deviceRotation == Surface.ROTATION_0) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_180)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_90)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        else if(deviceRotation == Surface.ROTATION_270)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top