Отключить ландшафтный режим в Android?

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

30 ответов


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

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

EDIT: поскольку это стало супер-популярным ответом, я чувствую себя очень виноватым, поскольку принуждение портрета редко является правильным решением проблем, к которым он часто применяется.
Главные предостережения с принудительным портретом:

  • это не освобождает вас от необходимости думать о деятельности события жизненного цикла или правильное сохранение / восстановление состояния. Есть много кроме того ... вращение приложения, которое может вызвать действие разрушение / отдых, включая неизбежные вещи, такие как многозадачность. Там нет ярлыков; научиться использовать пакеты и retainInstance фрагменты.
  • имейте в виду, что в отличие от довольно однородного опыта iPhone, есть много устройств, где портрет не является явно популярной ориентацией. Когда пользователи находятся на устройствах с аппаратными клавиатурами или игровыми площадками a la Droid 1-4, Xperia Play или Nvidia Shield, forcing portrait может сделать ваше приложение гигантские хлопоты юзабилити (особенно на щите). Если ваше приложение не имеет чрезвычайно конкретного варианта использования, который приведет к прямому негативному опыту для поддержки других ориентаций, вы, вероятно, не должны форсировать ландшафт. Я говорю о таких вещах, как: "это приложение дистанционного управления для телефона с ИК-бластером только на одной стороне устройства" или "это приложение кассового аппарата для одной конкретной модели планшета, всегда используемой в фиксированной аппаратной док-станции."

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

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

Я не знал о AndroidManifest.xml file switch до чтения этого сообщения, поэтому в моих приложениях я использовал это вместо этого:

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

просто добавьте этот атрибут в тег activity.

 android:screenOrientation="portrait"

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


Если вы не хотите проходить через хлопоты добавления ориентации в каждой записи манифеста activity лучше, создайте класс 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......
}

добавьте следующий фрагмент в файл манифеста.

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

эта поддержка только портретный режим


добавить 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">

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

если вы хотите сделать это программно ie. с помощью Java-кода. Вы можете сделать это, добавив следующий код в Java-класс, что вы не хотите быть отображены в ландшафтном режиме.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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


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

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

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

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

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


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

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

сделайте свой вид пейзаж

OrientationUtils.lockOrientationLandscape(mActivity);

сделайте свой вид портрет

OrientationUtils.lockOrientationPortrait(mActivity);

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

OrientationUtils.unlockOrientation(mActivity);

Ориентация Util Class

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

}

вы можете заставить свою конкретную деятельность всегда оставаться в портретном режиме, написав это в своем манифесте.в 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: screenOrientation= " портрет" к тегу действия в манифесте приложения.

например:

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

вы должны поставить этот код в файл манифеста.......

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

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

на создано AndroidManifest.xml (копирование его из сгенерированного). Затем добавьте android:screenOrientation="portrait " для всех элементов деятельности.


добавить android: screenOrientation= "портрет" в AndroidManifest.XML-файл. example <activity android:name=".MapScreen" android:screenOrientation="portrait"></activity>


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

сначала нужно убедиться, что вы включили подкласс приложения в свой проект. В 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);

        }

        ....

    });

}

}


в надежде помочь кому-то другому, следующий атрибут активности в 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);
        }

в Котлине же можно программно достичь используя ниже

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_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.

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


это сработало для меня, попробуйте добавить этот код в файл 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>