如何在Android中禁用横屏模式?

1055

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


3
你是在试图禁用自动旋转功能吗?尝试在竖屏视图下设置你偏好的方向。参考链接:http://code.google.com/android/reference/android/R.styleable.html#AndroidManifestActivity_screenOrientation - adam
32个回答

1815
在AndroidManifest.xml中的活动中添加android:screenOrientation="portrait"。例如:
<activity android:name=".SomeActivity"
          android:label="@string/app_name"
          android:screenOrientation="portrait" />

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

  • 这并不意味着您可以免除考虑活动生命周期事件或正确保存/恢复状态的责任。除了应用程序旋转之外,还有许多其他东西可以触发活动销毁/重新创建,包括不可避免的多任务处理。没有捷径;学会使用捆绑和retainInstance片段。
  • 请记住,与相当统一的iPhone体验不同,有些设备上竖屏不是明显的流行方向。当用户在带有硬件键盘或游戏手柄(例如Nvidia Shield),ChromebooksfoldablesSamsung DeX上时,强制竖屏可能会使您的应用程序体验变得受限或巨大的可用性麻烦。如果您的应用程序没有支持其他方向会导致负面体验的强烈UX论据,那么您应该不强制横屏。我说的是像“这是一个现金注册应用程序,专门为一个固定的硬件坞中的平板电脑型号设计”的东西。

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

  • 如果您的主要关注点是意外方向更改可能会导致设备传感器和软件无法很好地处理(例如,在基于倾斜的游戏中),请考虑支持横向和纵向,但在方向上使用nosensor。这将强制大多数平板电脑使用横向,大多数手机使用纵向,但我仍不建议对大多数“普通”应用程序采用此方法(某些用户喜欢在手机上键入横向软键盘,许多平板电脑用户在纵向阅读-您应该允许他们)。
  • 如果您出于某种原因仍需要强制纵向,则对于Android 2.3(姜饼)及更高版本,sensorPortrait可能比portrait更好;这允许倒置的纵向,这在平板电脑使用中非常常见。

62
可以针对整个应用程序进行操作。请查阅此链接:https://dev59.com/wmw15IYBdhLWcg3wO5OX#9784269。 - Liam George Betsworth
1
我注意到还有另一种肖像:sensorPortait。sensorPortait和portrait之间有什么区别? - LiangWang
1
如果你阅读过Google的文档: “纵向方向,但可以根据设备传感器是正常或反向的纵向。在API级别9中添加。“ 所以 - 也就是说 - “纵向,朝上或朝下,仅适用于Android 2.3+。” - Yoni Samlan
2
正如我在下面的回答中所指出的 - 为了解决几个问题,“nosensor”可能是一个更好的选择。 - Mike Weir
1
我必须说我不同意。并非所有的体验都适用于手机的横屏模式,因此您应该让用户体验决定,而不是传感器。但在平板电脑上则不是这种情况。 - Renzo Tissoni
显示剩余10条评论

119

在阅读这篇文章之前,我不知道有AndroidManifest.xml文件开关的存在。因此,在我的应用程序中,我使用了以下方法:

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

10
如果设备没有处于指定的方向,这可能会使您的活动在第一次加载时跳转。 - Dori
我曾经使用这种方法,在OnCreate中调用它,然后从某些资产文件中读取数据。如果我在设备处于横向方向时启动应用程序,它会旋转,但由于某种奇怪的原因(也许应该等待旋转完成),这将导致错误地读取那些初始化资产。使用XML替代方案不会出现此问题。 - Radu Simionescu
1
这可能是Android程序启动序列的问题。您可以尝试将setRequestedOrientation()移动到onResume()中吗? - Rich

53

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

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

如果你想使用Java代码实现,可以尝试以下方式:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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


32
很多答案都建议在AndroidManifest.xml文件中使用 "portrait"。这似乎是一个不错的解决方案,但正如文档中所指出的,您只针对可能仅具有横向模式的设备。您还会强制某些最适合横向模式的设备进入纵向模式,无法获得正确的方向。
我的建议是改用 "nosensor"。这将使设备使用其默认首选方向,不会阻止Google Play上任何购买/下载,并确保传感器不会干扰您的(在我这种情况下是NDK)游戏。

由于许多人都给了赞,我想指出我已经采用了其他答案建议的“纵向”选项,因为某些晦涩设备在实现应用内屏幕旋转时会产生不可预测的响应,这在后来成为了我的要求。我也怀疑任何带有“纵向”选项的应用程序都不会被任何Google Play设置所阻止。 - Mike Weir
Google Play实际上会在横屏设备上过滤掉仅支持竖屏的应用程序,请参见此页面上的说明:https://developer.android.com/guide/topics/manifest/activity-element.html(“您声明的值可以启用诸如Google Play之类的服务进行过滤”) - miracle2k

22

如果你想禁用你的Android应用程序(或单个活动)的Landscape模式,你只需要在AndroidManifest.xml文件中的活动标签中添加:

android:screenOrientation="portrait"

例如:

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

另一种方法:编程实现。

如果您希望以编程方式即使用Java代码来完成此操作,可以通过将以下代码添加到不希望在横屏模式下显示的活动的Java类中来实现。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

2
由于许多答案给出的建议与@Phoenix和@Yoni的好建议相矛盾,我认为一个好的底线是重申他们的建议:android:screenOrientation="nosensor"> - DSlomer64
1
@DSlomer64 是的。如果你想要适配平板设备,那么应该使用 nosensor 值而不是 portrait。 - IntelliJ Amiya

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>

15
如果您想要用户设置,则我建议使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 您可以从设置菜单更改设置。 我需要这样做是因为我的计时器必须对应于屏幕上的内容,旋转屏幕将销毁当前活动。

13

你可以在不需要所有活动扩展共同基类的情况下为整个应用程序执行此操作。

诀窍是首先确保在项目中包含一个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);
            }
            ....
        });
    }
}

8
在Activity的onCreate()方法中使用此代码。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

8
你需要在AndroidManifest.xml中更改android:screenOrientation="sensorPortrait"

改成什么? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接