以编程方式移除方向限制

16

我在清单文件中设置了一个仅支持竖屏方向的活动。但我需要根据条件取消这个限制。那么,如何通过编程实现取消方向限制?

更新:我的当前设置如下:

    <activity
        android:name=".activity.MainActivity"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar"
        android:screenOrientation="portrait"
        android:configChanges="orientation">


 /**
 * Defines whether the device being used is a tablet and if so adds horizontal orientation option.
 */
     protected void _updateScreenOrientationModes(){
         if(((MyApplication) getApplication())._isTablet == true)
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
         }
3个回答

20
无论你是否已经在你的清单文件中设置了android:screenOrientation,你都可以通过Activity.setRequestedOrientation()在程序中设置屏幕方向。

本质上,“解除限制”是通过以下方式实现的:

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

之后,当物理设备方向更改时,Activity将表现出默认的屏幕方向更改行为。

然而,很可能你实际上想要同时匹配当前的物理设备方向。我没有尝试过,但我相信如果你只是按照上述操作,如果设备在你执行操作时处于横向位置,那么它会一直保持纵向模式,直到你将设备物理地移动到纵向并切换到横向。

我会在清单文件中设置android:configChanges="orientation",并重写Activity.onConfigurationChanged()方法,在其中根据条件执行方向更改或缓存方向。这样,无论何时你的条件发生变化,你都可以方便地获取当前的物理方向,如果必要,就可以在那时进行更改。


我也考虑过这个问题 :). 但是使用UNSPECIFIED方法不起作用。 - user1384991
它在我的许多设备上绝对有效。你确定你真的到达了setRequestedOrientation()的调用吗? - Darshan Rivka Whittle
其实,我认为你可以简单地保持事情的简单性,现在我知道你的条件只是“它是平板电脑吗?”——请查看我的其他答案。 - Darshan Rivka Whittle
设置了这个标志后,我被困在竖屏模式中 :( Nexus 10 - dy_

2

通过使用 "setRequestedOrientation()",您可以以编程方式更改屏幕方向。

根据您所需的条件,在您的Java类中编写以下代码.....

要更改为纵向模式,请使用ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE常量:

     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

要切换为竖屏模式,请使用ActivityInfo.SCREEN_ORIENTATION_PORTRAIT常量:

   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

我想要移除限制,让Android决定应该使用哪个方向,因此,如果我在清单中定义了纵向,但我需要删除此限制-不清楚应将方向设置为哪个参数-用户可能会将设备保持在横向或纵向方向上-如何定义使用哪个?我需要允许平板电脑具有两种方向,而手机只能是纵向。关于您的答案-当平板电脑用户启动应用程序时,如何定义他的保持方向并将布局设置为适当的方向? - user1384991
另外,恐怕这种方法不允许两个方向,因为它限制了一个特定的方向。我已经尝试过SCREEN_ORIENTATION_UNSPECIFIED,但是没有成功。 - user1384991
1
以下的SCREEN-ORIENTATION-UNSPECIFIED是有效的,我已经使用过了。无论你在清单文件中表示什么,如果你在Java代码中指定了这个UNSPECIFIED调用,那么它默认会以竖屏模式显示。 - code_finder

2

我将保留我的另一个答案,因为它回答了你所问的更一般性的问题。然而,在回复其他人的评论中,你说:

我需要允许平板电脑旋转屏幕,并且只允许手机竖屏

你的特定情况实际上比一般情况更容易:从你的清单中删除android:screenOrientation="portrait"android:configChanges="orientation"以允许默认行为。然后,在启动期间,如果设备是手机,则强制选择竖屏方向。

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

一个设备在运行时显然永远不会从平板变成手机,因此您只需要在启动时执行一次此操作。平板电脑将获得默认行为,因此无论设备处于什么物理方向,它们都将使用该方向。手机将被强制为纵向,并保持这种状态。


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