Android 在活动可见之前设置屏幕方向

Android 在活动可见之前设置屏幕方向,android,screen,orientation,Android,Screen,Orientation,仔细阅读有关setRequestedOrientation的android文档,我发现: 更改此活动的所需方向。如果活动当前位于前台或影响屏幕方向,屏幕将立即更改(可能导致活动重新启动)。否则,将在下次活动可见时使用此选项 否则,将在下次活动可见时使用此选项 听起来很棒-在活动可见之前设置。 哎呀。这叫什么?实际上,在onCreate之前,我们没有活动的引用。那么如何设置屏幕方向呢 更新: -我的想法是直接创建具有所需方向的活动。当用户从设置中选择方向时-设置屏幕方向和此后开始的所有活动-以

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

  • 更改此活动的所需方向。如果活动当前位于前台或影响屏幕方向,屏幕将立即更改(可能导致活动重新启动)。否则,将在下次活动可见时使用此选项
否则,将在下次活动可见时使用此选项 听起来很棒-在活动可见之前设置。 哎呀。这叫什么?实际上,在onCreate之前,我们没有活动的引用。那么如何设置屏幕方向呢

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

如果要为“活动”设置屏幕方向,请使用AndroidManifest.xml文件中截取的以下内容:

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


将其放在onCreate中似乎完全合理

如果这不起作用,您可以尝试将其放在onPostCreate(Bundle)重写方法中

后期创建时受保护的空(捆绑包savedInstanceState)

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

派生类必须调用该方法的超类实现。如果没有,将抛出异常


我正在解决完全相同的情况,即活动方向是由用户在“设置”中知道和设置的,我希望以所需的方向开始活动

对我来说,解决办法是锁定活动的方向

android:screenOrientation=“锁定”


然后onCreate()调用setRequestedOrientation():

不再重新启动

    v.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            v.getViewTreeObserver().removeOnGlobalLayoutListener(this);                // reset
            Screen.Lock(); // lock
        }
    });

在onCreate()的末尾,您是否只是试图强制活动/应用程序的屏幕方向是特定的(横向、纵向)?如果是这样,您可以在Android清单中指定该信息。为什么不尝试将其作为onCreate中的第二行,看看它是否有效?如果我想回答你的问题,我会这么做。希望你现在已经解决了这个问题。我的评论是投票否决一个答案。在没有更新的情况下,您最初的问题没有给出您试图根据用户偏好设置方向的指示。以前的答案都是基于你们投票否决的答案。在开始之前我不知道方向。这取决于用户选择的配置。
   <activity android:name=".SomeActivity"
      android:label="@string/app_name"
      android:screenOrientation="locked">
    v.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            v.getViewTreeObserver().removeOnGlobalLayoutListener(this);                // reset
            Screen.Lock(); // lock
        }
    });