关于方向:在Android中禁用横向模式?

Disable landscape mode in Android?

如何在我的Android应用中禁用某些视图的横向模式?


android:screenOrientation="portrait"添加到AndroidManifest.xml中的活动。例如:

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

编辑:由于这已成为一个超级流行的答案,我感到非常内疚,因为强迫肖像很少是解决它经常应用的问题的正确方法。
强迫肖像的主要警告:

  • 这并不能免除你不得不考虑活动
    生命周期事件或正确保存/恢复状态。有很多
    除了可以触发活动的app旋转之外的东西
    破坏/娱乐,包括不可避免的事情,如多任务处理。没有捷径;学会使用bundle和retainInstance片段。
  • 请记住,与相当统一的iPhone体验不同,有些设备的肖像不是明显流行的方向。当用户使用带有硬件键盘或游戏手柄的设备时,可以使用Nvidia Shield,Chromebook,折叠式设备或Samsung DeX,强制人像会让您的应用体验受到限制或巨大的可用性麻烦。如果您的应用程序没有强大的用户体验参数,这会导致支持其他方向的负面体验,那么您可能不应强制使用横向广告。我说的是"这是一个收银机应用程序,适用于固定硬件底座中常用的一种特定型号的平板电脑。"

因此,大多数应用应该让手机传感器,软件和物理配置自行决定用户如何与您的应用进行互动。但是,如果您对用例中sensor方向的默认行为不满意,可能还需要考虑一些案例:

  • 如果您的主要关注点是意外方向改变,您认为设备的传感器和软件无法很好地应对(例如,在基于倾斜的游戏中),请考虑支持横向和纵向,但使用nosensor进行定位。大多数手机上的大多数平板电脑和人像都有这种风景,但我仍然不建议大多数"普通"应用程序(有些用户喜欢在手机上键入横向软键盘,许多平板电脑用户都是纵向阅读 - 和你应该让他们)。
  • 如果由于某种原因仍然需要强制使用肖像,那么对于Android 2.3+,sensorPortrait可能优于portrait;这允许颠倒的肖像,这在平板电脑使用中非常常见。


在阅读这篇文章之前我不知道AndroidManifest.xml文件切换,所以在我的应用程序中我使用了它:

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


在清单文件中添加此android:screenOrientation="portrait",您可以在此处声明您的活动

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

如果你想用java代码试试

1
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

onCreate()中为活动调用setContentView方法之前。

希望这对所有人都有帮助并且易于理解......


这里的很多答案都建议在AndroidManifest.xml文件中使用"portrait"。这看起来似乎是一个很好的解决方案 - 但正如文档中所述,您正在挑选出可能只有景观的设备。您还强制某些设备(在横向上效果最佳)进入人像,而不是获得正确的方向。

我的建议是改用"nosensor"。这将使设备使用其默认首选方向,不会阻止在Google Play上进行任何购买/下载,并确保传感器不会弄乱您的(NDK,在我的情况下)游戏。


如果你想要用户设置,

然后我推荐setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

您可以从设置菜单更改设置。

我需要这个,因为我的计时器必须与屏幕上的内容相对应,旋转屏幕会破坏当前的活动。


只需在你的清单中添加Like this Line

android:screenOrientation="portrait"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<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>
               
                <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>

在Activity的onCreate()中使用它

1
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

只需在您的活动代码中添加此属性即可。

1
 android:screenOrientation="portrait"

如果您不想更好地处理在每个清单活动条目中添加方向的麻烦,请创建一个BaseActivity类(继承"Activity"或"AppCompatActivity"),它将由应用程序的每个活动继承而不是"活动" '或'AppCompatActivity',只需在BaseActivity中添加以下代码:

1
2
3
4
5
6
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // rest of your code......
}


您应该在AndroidManifest.xml中更改android:screenOrientation="sensorPortrait"


在您的清单文件中添加以下代码段。

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

这仅支持肖像模式


android:screenOrientation="portrait"添加到要禁用横向模式的活动。


如果要禁用Landscape mode for your android app(或单个活动),您只需添加,

android:screenOrientation="portrait"AndroidManifest.xml文件中的activity标记。

喜欢:

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

另一种方式,程序化方法。

如果你想以编程方式这样做,即。使用Java代码。您可以通过在不希望以横向模式显示的活动的Java类中添加以下代码来执行此操作。

1
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

希望对您有所帮助。有关详细信息,请访问此处,在此处输入链接说明


如何在某些视图中更改方向

您可以使用此类以实际方式动态锁定任何视图的方向,而不是锁定整个活动的方向: -

让你的景观风景

1
OrientationUtils.lockOrientationLandscape(mActivity);

让你的肖像

1
OrientationUtils.lockOrientationPortrait(mActivity);

解锁方向

1
OrientationUtils.unlockOrientation(mActivity);

方向工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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);
    }

}


如果您使用的是Xamarin C#,其中一些解决方案将无效。这是我发现的解决方案。

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

在类之上运行良好,与其他解决方案类似,也不是全局适用的,需要放在每个活动标题中。


您可以通过在manifest.xml中写入此操作来强制您的特定活动始终保持纵向模式

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

您还可以通过在活动的onCreate()方法中写下以下行来强制您的活动保持在postrait模式

1
2
3
4
5
6
7
8
    @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="portrait"
到应用程序清单中的activity标记。

例如:

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

你应该把这段代码放在清单文件中.......

1
2
3
4
5
    <activity android:name=".SunderFlowersActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
        >
    </activity>

在oncreate()方法中添加类

1
 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


您必须设置每个活动的方向。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<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>

使用

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

1
2
3
4
5
6
7
8
9
10
11
    . . .
    <manifest . . . >
        . . .
       
            <activity android:name=".MyActivity"
                android:screenOrientation="portrait"
                android:configChanges="keyboardHidden|orientation">
            </activity>
        </application>
    </manifest>
</android>

您可以为整个应用程序执行此操作,而无需使所有活动扩展为公共基类。

首先要确保在项目中包含Application子类。在您的应用首次启动时调用的onCreate()中,您注册了一个ActivityLifecycleCallbacks对象(API级别14+)以接收活动生命周期事件的通知。

这使您有机会在应用程序中的任何活动开始(或停止,恢复或其他)时执行您自己的代码。此时,您可以在新创建的活动上调用setRequestedOrientation()。

并且不要忘记在清单文件中添加app:name ="。MyApp"。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
            }
            ....
        });
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 <?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">
       

            <intent-filter>
               

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

</manifest>

我们可以使用属性或android:screenOrientation限制纵向或横向模式下的活动。

如果我的程序中有多个活动,那么您可以自由地限制任何一个模式中的任何一个活动,它永远不会影响您不想要的其他活动。


在您的项目中添加以下表示,

npm install

npm i react-native-orientation-locker

然后你使用清单类,如,
React_Native(您的项目文件夹)/
Android设备/应用/ src目录/主/ AndroidManifest.xml中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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>
       
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
 
</application>

谢谢!


/platform/android目录中创建AndroidManifest.xml(从生成的目录中复制它)。
然后将android:screenOrientation="portrait"添加到所有活动元素。


在AndroidManifest.xml文件中添加android:screenOrientation="portrait"

例如 :

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

在清单类中。

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

或以编程方式

1
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

注意:您应该在onCreate()之前为onCreate()中的活动调用此方法。


它对我有用,尝试在AndroidManifest文件中添加此代码

1
2
3
4
5
6
7
8
9
10
11
<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>

在kotlin中,可以使用以下方法以编程方式实现

1
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

如果您的活动与第一个设备方向状态相关,请在onCreate方法中获取当前设备方向,然后永久修复它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        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);
        }

为了帮助其他人,AndroidManifest.xml中ACTIVITY的以下属性就是您所需要的:

机器人:configChanges ="方向"

所以,完整的活动节点:

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