锁定屏幕方向(Android)

161

我正在编写一个使用不同内容(活动)的选项卡的 Android 应用程序。 在其中一个活动中,我想将屏幕方向锁定为“横向”模式, 但在其他活动中,我希望使用传感器来获得正常方向。

现在我正在调用

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

当我切换到横屏模式的活动时,

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

当我切换回其他活动时,这种方法似乎不起作用,整个应用程序会死锁。在这种情况下,处理问题的常规方法是什么?


23
“Possible Duplicate”链接并不是这个问题的重复问题。这个问题要求如何锁定方向,以防止从横屏模式切换到其他模式。而链接的问题则是询问如何在方向改变时防止应用程序重新启动。 - Kent
这似乎是你想要的:从 https://github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/delight/android/baselib/Screen.java 调用 Screen.lockOrientation(this) 和稍后调用 Screen.unlockOrientation(this) - caw
只是一个警告,如果你正在使用inline ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT,这在4.3以下不被允许。然后你可以使用above或者ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT。 - Akshay
对于未来的读者而言,@caw的方法并不是在常规Android应用程序上下文中可访问的方法。 - Abandoned Cart
@LoungeKatt 不是的,但我确实链接到了实现,不是吗?无论如何,我刚刚发现链接已经失效了。这里是Screen.lockOrientationScreen.unlockOrientation源代码的更新链接:https://github.com/delight-im/Android-Commons/blob/f220021846f66917d56d465c7150bce9b585c08d/Source/library/src/main/java/im/delight/android/commons/Screen.java#L48 - caw
显示剩余3条评论
3个回答

259

在清单文件中,您可以将screenOrientation设置为landscape。在XML中它看起来像这样:

<activity android:name="MyActivity"
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation|screenSize">
...
</activity>

需要保持横屏的活动为 MyActivity

android:configChanges=... 这一行代码会阻止在屏幕旋转时调用 onResume()onPause() 方法。若没有这一行代码,虽然屏幕会保持为所需的横屏状态,但这两个方法仍然会被调用。

注意:对于 Android 3.2(API 等级 13)以下的版本,必须包括 keyboardHiddenorientation 选项,在 3.2 或以上版本中三个选项均是必须的,而不仅仅是 orientation


它似乎不起作用,我有什么遗漏吗? - user573536
3
嗯,是的,如果Activity在TabHost内运行似乎不起作用。我认为你使用setRequestedOrientation可能有正确的想法,但请尝试将调用放在onResume中,而不是onCreate中,并且在非横向Activity中使用ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED而不是SENSOR。我的模拟器也因传感器出现问题,但使用未指定选项可以解决。 - Kevin Dion
有没有办法为服务定义方向?基本上我编写了一个LiveWallpaper服务...需要限制设备方向。 - CoDe
这会使我的屏幕只顺时针旋转,如何逆时针旋转? - nikoo28
谢谢 @KevinDion,这对我有用。 - Xplosive
这种方法有很多缺点,自2016年以来被认为是一种反模式。最好学习Activity生命周期,特别是在旋转设备时调用哪些事件。不过我目前正在寻找解决方案。 - Tim Kist

65
我遇到了类似的问题。 当我输入以下内容时:
<activity android:name="MyActivity" android:screenOrientation="landscape"></activity>
在清单文件中,这会导致该活动以横向显示。但是,当我返回到之前的活动时,它们显示为横向,即使它们被设置为纵向。但是通过添加

可以解决这个问题。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

在目标活动的OnCreate部分之后立即解决了问题。所以现在我同时使用两种方法。


1
只是提醒一下,如果您正在使用ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT,请注意在4.3以下是不允许的。您可以使用上述或ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT。 - Akshay
1
警告:使用setRequestedOrientation()会导致Activity重新启动,触发onResume等两次。在每个这样做的活动中将其添加到清单中以避免此问题:android:configChanges="keyboardHidden|orientation|screenSize" - bluehallu

40

在您的项目的Android清单文件中,找到您想要固定方向的Activity声明,并添加以下代码:

android:screenOrientation="landscape"

针对横向模式,请添加以下代码,针对纵向模式,请添加以下代码,

android:screenOrientation="portrait"

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