1015

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

4

31 回答 31

1762

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

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

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

  • 这并不能免除您必须考虑活动生命周期事件或正确保存/恢复状态的责任。除了应用程序轮换之外,还有很多事情可以触发活动破坏/重新创建,包括不可避免的事情,例如多任务处理。没有捷径;学习使用包和retainInstance片段。
  • 请记住,与相当统一的 iPhone 体验不同,有些设备的纵向并不是明显流行的方向。当用户使用带有硬件键盘或游戏手柄的设备(例如 Nvidia Shield、Chromebook可折叠设备或Samsung DeX)时,强制人像可能会使您的应用体验受到限制或极大的可用性麻烦。如果您的应用程序没有强大的 UX 参数会导致支持其他方向的负面体验,那么您可能不应该强制横向。我说的是“这是一款收银机应用程序,适用于始终用于固定硬件底座的特定型号平板电脑”。

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

  • 如果您主要担心的是在您认为设备的传感器和软件无法很好应对的活动过程中意外的方向变化(例如,在基于倾斜的游戏中),请考虑支持横向和纵向,但使用nosensor用于方向。这会强制大多数平板电脑上的横向和大多数手机上的纵向,但我仍然不建议对大多数“普通”应用程序这样做(一些用户只是喜欢在手机上输入横向软键盘,而许多平板电脑用户以纵向阅读 - 和你应该让他们)。
  • 如果由于某种原因仍然需要强制人像,sensorPortrait可能比portraitAndroid 2.3 (Gingerbread) 及更高版本更好;这允许倒置的肖像,这在平板电脑使用中很常见。
于 2009-02-24T17:04:33.523 回答
117

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Fixed portrait orientation
于 2010-10-18T14:53:15.503 回答
49

android:screenOrientation="portrait"在您声明活动的清单文件中添加。像这样:

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

如果您想使用 Java 代码执行此操作,请尝试:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

在为您的活动调用setContentView方法之前onCreate()

于 2012-09-27T09:47:53.777 回答
31

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

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

于 2013-08-21T14:41:33.673 回答
16

只需在您的清单中添加这一行:

android:screenOrientation="portrait"

像:

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

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

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

    </application>

</manifest>
于 2015-02-05T09:30:58.550 回答
15

如果您想要用户设置,那么我建议您setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

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

于 2012-02-10T04:46:49.323 回答
15

如果您想禁用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);
于 2015-03-16T05:25:50.040 回答
12

您可以对整个应用程序执行此操作,而不必让所有活动都扩展一个公共基类。

诀窍是首先确保在项目中包含一个 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);
            }
            ....
        });
    }
}
于 2018-04-05T09:28:42.990 回答
8

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

于 2014-01-03T06:04:00.097 回答
8

在 Activity 的 onCreate() 中使用它

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
于 2015-05-06T09:59:31.527 回答
7

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

 android:screenOrientation="portrait"
于 2013-10-01T07:00:13.207 回答
7

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

于 2014-01-26T09:30:04.750 回答
7

如果您不想更好地在活动的每个清单条目中添加方向的麻烦,请创建一个 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......
}
于 2017-04-22T17:51:53.213 回答
6

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

除了锁定整个活动的方向,您可以使用此类从任何视图中动态地锁定方向,实用:

让你的视野风景

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

}
于 2016-04-28T06:24:30.057 回答
5

采用:

android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" 
于 2012-05-14T16:42:12.987 回答
5

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

<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>
于 2015-02-04T07:23:24.877 回答
5

如果您使用的是Xamarin C#,其中一些解决方案将不起作用。这是我发现可行的解决方案。

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

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

于 2016-03-20T14:52:58.373 回答
4

在 oncreate() 方法中添加一个类:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
于 2016-01-02T04:54:42.240 回答
4

您可以通过在manifest.xml文件中写入以下内容来强制您的特定活动始终保持纵向模式:

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

您还可以通过在活动的 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);
}
于 2017-01-16T06:25:01.260 回答
4

把它放到你的清单中。

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="sensorPortrait" />

方向将是纵向的,但如果用户的手机是倒置的,它也会显示正确的方向。(所以你的屏幕会旋转 180 度。)


如果活动在多窗口模式下运行,系统将忽略此属性。

更多:https ://developer.android.com/guide/topics/manifest/activity-element

于 2020-03-20T14:09:51.030 回答
3
<android . . . >
    . . .
    <manifest . . . >
        . . .
        <application>
            <activity
                android:name=".MyActivity"
                android:screenOrientation="portrait"
                android:configChanges="keyboardHidden|orientation">
            </activity>
        </application>
    </manifest>
</android>
于 2012-09-04T06:30:56.640 回答
3
<?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>

我们可以通过使用属性 或 将 Activity 限制为纵向或横向模式android:screenOrientation

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

于 2017-07-26T12:03:07.143 回答
3

在清单类中:

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

或以编程方式:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

注意:setContentView你应该为你的活动调用这个 before方法onCreate()

于 2018-05-13T17:23:06.730 回答
3

将以下命令添加到您的项目中,

npm install

npm i react-native-orientation-locker

然后你使用像 React_Native (Your Project Folder)/android/app/src/main/AndroidManifest.xml 这样的清单类:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.payroll_react">

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

</manifest>
于 2018-12-27T09:14:12.843 回答
2

<apphome>/platform/android目录中,创建AndroidManifest.xml(从生成的目录中复制它)。

然后添加android:screenOrientation="portrait"所有活动元素。

于 2011-09-19T10:46:58.503 回答
2

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

例如:

<activity 
    android:name=".MapScreen"
    android:screenOrientation="portrait"></activity>
于 2012-02-01T07:42:51.080 回答
2

它对我有用。尝试在 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>
于 2018-02-06T09:53:20.760 回答
1

AndroidManifest.xml中Activity的以下属性就是您所需要的:

android:configChanges="orientation"

所以,完整的活动节点:

<activity
    android:name="Activity1"
    android:icon="@drawable/icon"
    android:label="App Name"
    android:configChanges="orientation">
于 2013-07-17T22:53:22.560 回答
1

Kotlin中,同样可以使用以下代码以编程方式实现:

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
于 2017-06-11T15:07:31.550 回答
0

如果您的活动与第一个设备方向状态相关,请在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);
}
于 2016-09-22T15:14:09.610 回答
0

添加android:screenOrientation="portrait"您的清单。如果您想为特定活动应用模式,请在所需的活动标签中定义它。或者在整个应用程序的应用程序标签中定义。像:

<application
    <!-- ... -->
    android:screenOrientation="portrait"
</application>
于 2020-07-02T06:46:12.843 回答