只支持竖屏或反向竖屏模式的活动

20

我希望我的活动仅在纵向和反向纵向两种模式下可用。我该如何实现这一点?当我设置 android:screenOrientation="portrait" 时,它将强制活动仅处于普通纵向状态,反之亦然。

请不要告诉我强制/锁定方向是一个不好的方法。我知道这一点,但客户仍然要求这样做。感谢您的理解和任何想法。

更新:API等级在11及以上


5
在我看来,这不是一个坏的做法。有些应用程序/游戏在特定方向下无法正常工作。 - Ricky
谢谢,Ricky。没错,我在类似的帖子上看到人们争论这个问题,所以我想澄清一下,我确实只需要竖屏。 - Speedy
许多电子商务应用程序也会锁定方向。 - Shubham AgaRwal
3个回答

48

如果您的API级别为9或更高,请使用android:screenOrientation="sensorPortrait"

纵向方向,但根据设备传感器可以是普通纵向或反向纵向。在API级别9中添加。

文档


谢谢!我一定是瞎了,没看到那个值!没错,我使用的是API 11+,所以这个完美地运作。 - Speedy
4
我不得不在API 15上使用错字版的“sensorPortait”。 - Richard
这样可以旋转视图,但不会触发任何事件。我需要捕获从正常视图到反向视图的方向变化事件。如何做到这一点? - StarDust
我需要监听方向变化,除了传感器纵向模式,还有什么建议吗? - Amit Hooda
注意:我无法使 sensorPortrait 正常工作。它永远不支持倒置的竖屏(即 reversePortrait)。但是,使用 fullSensor 可以正常工作,但它也允许横屏。对我来说这没问题,但如果你只想要 portraitreversePortrait,你可以在你的 Activity 中使用 onConfigurationChangednewConfig.orientation 拦截方向更改,并忽略或覆盖横屏更改。 - Joshua Pinter

1

为了后代,我将其用于向后兼容...

public final class OrientationHelper {

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    public static void setRequestedOrientationSensorPortrait(Activity activity) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
        } else {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    public static void setRequestedOrientationSensorLandscape(Activity activity) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
        } else {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    }
}

使用
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    OrientationHelper.setRequestedOrientationSensorPortrait(this);
    super.setContentView(R.layout.my_layout);
}

0
AndroidManifest.xml 文件中:
android:screenOrientation="portrait|reversePortrait"
android:configuration="keyboardHidden|orientation"

在你的WhateverActivity.java文件中:
protected void onConfigurationChanged(Configuration newConfig) {
    int currentOrientation = getResources().getConfiguration().orientation;
    if(newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ||
        newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) {
        super.onConfigurationChanged(newConfig);
    }
}

你可以试试这个 :)

谢谢,这是一个很好的回答,但是我忘了告诉你我使用的是 API 11+(蜂巢),所以alextc的答案更适合我,而且也很好用。不知道为什么,当我尝试在 screenOrientation 中使用 | 符号时,我遇到了 AAPT 错误,所以我只能使用一个值而无法使用两个值 :( - Speedy
13
@xjaphx,android:screenOrientation="portrait|reversePortrait"。这并不起作用。会出现以下错误:“error: Error: String types not allowed (at 'screenOrientation' with value 'portrait|reversePortrait')”。 - Paul Annekov
2
@PaulAnnekov 这是因为它是一个简单的枚举,所以你不能使用 "|" 来组合值。 - android developer

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