14

In my manifest I've setup an activity restricted to portrait orientation. But I need to remove this restriction on condition. So, how do I achieve removing orientation restrictions programmatically ?

upd: my present settings are:

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

3 回答 3

19

无论您是否android:screenOrientation在 Manifest 中设置,您都可以使用Activity.setRequestedOrientation()以编程方式设置方向。

实质上,“解除限制”是通过以下方式完成的

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

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

但是,您可能希望同时实际匹配当前的物理设备方向。我还没有尝试过,但是我很确定如果您所做的只是上述操作,如果设备在您进行操作时处于横向,那么您将保持纵向模式,直到您实际移动设备纵向并返回横向。

我要做的是确保android:configChanges="orientation"在您的 Manifest 中设置并覆盖Activity.onConfigurationChanged(),您可以在其中根据您的情况执行方向更改或缓存方向。然后,只要您的状况发生变化,您就可以方便地掌握当前的身体方向,以便您可以在必要时更改它。

于 2012-05-31T08:50:36.860 回答
2

我将留下我的另一个答案,因为它解决了您提出的更普遍的问题。但是,在对其他人的评论中,您说:

我需要允许平板电脑同时具有方向和手机只有纵向

您的特定情况实际上比一般情况更容易:从您的清单中删除两者android:screenOrientation="portrait"android:configChanges="orientation"允许默认行为。然后,在启动过程中,如果设备是手机,请使用

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

显然,设备在运行时永远不会在平板电脑或手机之间发生变化,因此您只需在启动时执行一次。平板电脑将获得默认行为,因此无论设备处于何种物理方向,这就是他们将使用的方式。手机将被迫进入纵向并保持这种状态。

于 2012-05-31T09:13:16.740 回答
1

以编程方式,您可以使用“setRequestedOrientation()”更改屏幕方向

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

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

     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

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

   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
于 2012-05-31T08:04:25.790 回答