3

仔细阅读有关 setRequestedOrientation 的 android 文档,我发现:

  • 更改此活动的所需方向。如果 Activity 当前处于前台或以其他方式影响屏幕方向,则屏幕将立即更改(可能导致 Activity 重新启动)。否则,这将在下次活动可见时使用。

“否则,下次活动可见时将使用它。” 听起来很棒 - 只是在活动变得可见之前设置。哎呀。这个在哪里称呼?实际上在 onCreate 之前我们没有对活动的引用。那么如何设置屏幕方向呢?

更新: - 我的想法是直接以所需的方向创建活动。当用户从设置中选择方向时 - 设置屏幕方向和之后开始的所有活动 - 了解所需的方向 / 就像他们使用清单 / 中的值一样。如果我知道所需的方向 - 没有理由创建活动,设置方向并再次创建它。

4

4 回答 4

2

我正在解决完全相同的情况,即 Activity 方向是已知的并由用户在“设置”中设置,我想以所需的方向启动 Activity。

对我来说,解决方案是锁定 Activity 的方向

安卓:screenOrientation="锁定"

   <activity android:name=".SomeActivity"
      android:label="@string/app_name"
      android:screenOrientation="locked">

和 onCreate() 我调用 setRequestedOrientation():

再也不用重启了。

于 2019-01-22T13:13:22.040 回答
1

将它放在 onCreate 中似乎非常合理。

http://russenreaktor.wordpress.com/2010/01/03/solved-set-screen-orientation-programmatically/

如果这不起作用,您可以尝试将其放入 onPostCreate(Bundle) 覆盖的方法中。

protected void onPostCreate (Bundle savedInstanceState)

自:API 级别 1 在活动启动完成时调用(在调用 onStart() 和 onRestoreInstanceState(Bundle) 之后)。应用程序一般不会实现此方法;它旨在让系统类在应用程序代码运行后进行最终初始化。

派生类必须调用该方法的超类实现。如果他们不这样做,将引发异常。

于 2012-04-24T13:45:13.393 回答
0
    v.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            v.getViewTreeObserver().removeOnGlobalLayoutListener(this);                // reset
            Screen.Lock(); // lock
        }
    });

在 onCreate() 结束时

于 2020-01-03T21:48:11.280 回答
-1

如果您想为活动设置屏幕方向,请使用 AndroidManifest.xml 文件中的此片段:

<activity android:screenOrientation="portrait" android:name="MyActivity"></activity>

或者

<activity android:screenOrientation="landscape" android:name="MyActivity"></activity>
于 2012-04-24T13:19:10.290 回答