【问题标题】:Lock screen orientation when targeting Android API 27 with a non-opaque activity锁定具有非透明活动的 Android API 27 时的屏幕方向
【发布时间】:2017-10-27 17:41:16
【问题描述】:

我有一个将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",应用程序不会崩溃,但我希望能够保持这种状态。

【问题讨论】:

  • 能够选择具有半透明活动的方向是没有意义的。如果您下面的 Activity 不支持该 Activity 或自己锁定它怎么办?那将如何运作?如果它被允许,它就会出现漏洞。
  • 所以我的用例是这个半透明的活动只显示在我自己的应用程序中(而不是作为另一个应用程序的覆盖)。这是一个覆盖我的主要活动的搜索活动,主要活动也不旋转
  • 经过一番实验,我发现在类似的半透明activity中去掉screenOrientation属性后,我的activity还是不会旋转,和后面的一样 b> 还有带有 portrait 值的 screenOrientation 属性。

标签: java android android-activity


【解决方案1】:

我也遇到了同样的问题。 正如其他人所说,如果我删除 android:screenOrientation="portrait" 或用 android:screenOrientation="unspecified" 覆盖它,那么异常就消失了。 并且似乎前面活动的方向跟随后面活动的方向。

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

【讨论】:

  • 我同意这个答案——但我确实质疑为什么它只在奥利奥上坏了,因为奥利奥 MR1 很好。
  • 在我们的主要活动之上有一个半透明活动。这两项活动都标记为android:screenOrientation="portrait"。如果使用 Target API 27 运行 Android 8.0,应用会崩溃。在 Target API 26 和 Android 8.1 或 7 上的 API 27 时不会导致问题。
  • 我的项目中的任何地方都没有screenOrientation=,但仍然会发生这种崩溃。
  • @doctorram,也许你的 java 代码中有这样的东西 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
  • @DiogoRosa,是的,我愿意!
【解决方案2】:

解决方法是将targetSdk 设置回26

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

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


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

【讨论】:

  • 这不是真正的解决方案。如果有人以 API 27 为目标,那是有原因的。
  • @HarishVishwakarma 是的,你完全正确。因此,我将“解决方案”一词更改为“解决方法”。而且这不是永远的,因为 Google 会强制将新的 APK 上传到 GPlay 以针对最新的 API。
  • 目前,最好的解决方案是将您的 targetSdk 更改为 26。这是 google 发布的一个问题,它将在新版本中修复 - 2017 年 11 月 2 日上午 7:47 标记为已修复 我们的工程团队已解决此问题。它将在未来的 Android 版本中提供,因此请留意发行说明。
  • @heeleeaz 我们有 2019 年第二季度,API 29,但仍未修复...是在新的 Android 版本 8.1+ 中已修复,但在 8.0 中未修复...
  • 这实际上只是一种“解决方法”。不过,感谢问题的根源。
【解决方案3】:

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

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

【讨论】:

  • 如果需要锁定activity,因为它继承了父activity的方向,所以需要锁定父activity的方向。我通过在活动开始之前锁定方向并在透明活动结束时释放方向来做到这一点。您可以通过使用请求代码启动活动并覆盖 onActivityResult() 来实现。检查请求代码,如果这是您期望释放方向的请求代码。
【解决方案4】:

我通过更改 NoActionBar 样式中的这一行解决了这个问题

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

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

【讨论】:

  • ??意味着什么@Sakthi
  • 我在 style.xml 文件中使用了 false。但没有解决我的问题。
  • 没有出现任何错误,存在设计问题。如果屏幕是横向模式旋转后得到纵向设计。
【解决方案5】:

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

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

TranslucentActivity 的方向来自后面的 Activity。

【讨论】:

  • 活动也需要全屏才能请求方向。这非常令人困惑,我真的不喜欢在 Android O 中使用它。与其崩溃是一个很大的行为变化,他们应该简单地忽略它(这也很糟糕!)
【解决方案6】:

这似乎是 API 27 上的一个新功能/错误。 但是,您可以删除 安卓:屏幕方向 要么 android:screenOrientation="未指定"

【讨论】:

  • 不是bug,半透明的activity充当了一个对话框,所以它和它的父Activity(启动它的那个)有相同的方向
【解决方案7】:

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

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

只需添加两个文件夹

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 的一个常见错误

【讨论】:

    【解决方案8】:

    感谢@JerabekJakub。我的测试结果——保持sdk 27​​,去掉下面几行也可以解决crash。

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

    【讨论】:

    • 删除 configChanges 的原因??
    • 但这会导致屏幕旋转——这是我们不想要的。
    • 我已经根据 JerabekJakub 的描述测试了我的 - 如果你的半透明后面有固定方向的非半透明活动,半透明不会旋转。
    • 去掉 android:screenOrientation="portrait" 就足够了
    【解决方案9】:

    1) 删除此

    android:screenOrientation="portrait" 
    

    来自 minifiest.xml

    2) 在Activity上添加这两行

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

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 2021-04-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多