使用非不透明活动定位Android API 27时锁定屏幕方向

时间:2017-10-27 17:41:16

标签: java android android-activity

我的活动android:windowIsTranslucent设置为trueandroid:windowBackground设置为半透明背景。我刚刚更改了目标并将sdk版本编译为27,现在启动此活动时出现异常:

java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

由于这是一个新的sdk,目前还没有关于它的任何内容(它似乎来自这行代码:https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/Activity.java#987

有没有办法解决这个问题?如果我从我的清单中取出android:screenOrientation="portrait"用于此活动,该应用程序不会崩溃,但我希望能够保持这样。

9 个答案:

答案 0 :(得分:27)

我也遇到了同样的问题。 正如其他人所说,如果我删除 android:screenOrientation =" portrait" 或用 android:screenOrientation ="未指定" 覆盖它,然后异常消失了。 并且前方活动的方向似乎遵循了背后活动的方向。

我想到了。 如果前方活动是透明的,并且后方活动的方向不同, 显示变得奇怪。 所以,我可以理解为什么添加这个检查逻辑 但是,我想知道为什么Developer Preview 8.0.0中没有出现这个问题。

答案 1 :(得分:16)

解决方法是将targetSdk设置回26

此提交中您的应用程序崩溃的原因是here

正如您所看到的here,您不是唯一的一个 - 此行为已被Google报告为问题。它已被修复,但我们不知道它将如何以及何时发布。

我还可以确认" sofakingforever"评论中说,如果在半透明后面有固定方向的非半透明活动,半透明将不会旋转。因此,您也可以从清单中删除android:screenOrientation="portrait"

答案 2 :(得分:4)

对我有用的解决方案是删除

android:screenOrientation="portrait" 

来自所有全屏透明活动,这意味着其主题包含

<item name="android:windowIsTranslucent">true</item>

另外,为了确保定向在Oreo以下均正确,我将其添加到活动的onCreate()中。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // This activity is a fullscreen transparent activity, so after Oreo Android doesn't allow fullscreen
    // transparent activities to specify android:screenOrientation="portrait" in the manifest. It will pick up
    // from the background activity. But for below Oreo we should make sure that requested orientation is portrait.
    if (VERSION.SDK_INT < VERSION_CODES.O) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

答案 3 :(得分:3)

我通过在NoActionBar样式

中更改此行来解决此问题
  
    

在目标版本27中,我只有这个问题,我通过使用下面的行解决了

  
<item name="android:windowIsTranslucent">false</item>

答案 4 :(得分:2)

所以我做的是从清单中删除任何screenOrientation属性并将其添加到我的BaseActivity(我的所有活动都扩展),此代码

 if(!(this instanceof TranslucentActivity)){
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

TranslucentActivity将具有来自活动背后的方向。

答案 5 :(得分:1)

似乎它是API 27上的新功能/错误。 但是,您可以删除 机器人:screenOrientation 要么 机器人:screenOrientation =&#34;未指定&#34;

答案 6 :(得分:1)

我最近遇到了这个问题,这是解决方案。

无需更改您在android清单文件中设置的屏幕方向参数。

只需在其中添加两个文件夹

res>values
as  res>values-v26 
and res>values-v27

然后将您的styles.xml和themes.xml文件复制到那里。

并将以下参数从TRUE更改为FALSE。

<item name="android:windowIsTranslucent">true</item>

<item name="android:windowIsTranslucent">false</item>

它将起作用。

Android 8.0的常见错误

答案 7 :(得分:0)

谢谢@JerabekJakub。我的测试结果 - 保留sdk 27​​并删除以下行也可以解决崩溃问题。

 android:configChanges="orientation"
 android:screenOrientation="portrait"

答案 8 :(得分:0)

1)删除此

android:screenOrientation="portrait" 

来自minifyst.xml

2)在“活动”上添加这两行

 protected void onCreate(Bundle savedInstanceState) {
     setOrientation(this)
     super.onCreate(savedInstanceState);
     // other other all code here

 }

3)只需将代码复制粘贴到您的活动中

 public static void setOrientation(Activity context) {
          if (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.O)
              context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
          else
              context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }