Only fullscreen opaque activities can request orientation

问题

Android8.0手机,在使用全屏且透明的theme,作为Activity的主题的同时,使用screenOrientation固定了Activity的方向。在这种情况下,会抛出以下异常:

1
java.lang.RuntimeException:Unable to start activity ComponentInfo{xxActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
2
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3303)
3
......
4
java.lang.IllegalStateException:Only fullscreen opaque activities can request orientation
5
android.app.Activity.onCreate(Activity.java:1081)
6
androidx.core.app.ComponentActivity.void onCreate(android.os.Bundle)(ComponentActivity.java:85)
7
androidx.activity.ComponentActivity.void onCreate(android.os.Bundle)(ComponentActivity.java:154)
8
androidx.fragment.app.FragmentActivity.void onCreate(android.os.Bundle)(FragmentActivity.java:312)
9
androidx.appcompat.app.AppCompatActivity.void onCreate(android.os.Bundle)(AppCompatActivity.java:115)

使用 AndroidXref 查看源码:

protected void onCreate(@Nullable Bundle saveInstanceState) {
  if(getApplicationInfo().targetSdkVersion > O && mActivityInfo.isFixedOrientation() {
    final TypedArray ta = obtainStyleAttributes(R.styleable.Window);
    final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta);
    if(isTranslucentOrFloating) {
      throw new IllefalStateException("Only fullscreen opaque activities can request orientation");
    }
}

从代码可以看出,抛出该异常,需要满足以下的条件

  • ActivityInfo.isFixedOrientation()
    Activity是否使用 screenOrientation 固定了页面方向。
  • isTranslucentOrFloating
    是否使用了透明或者悬浮窗主题,即满足下面的情况:
    1. true
    2. true
  • targetSdkVersion > O
    当前使用的编译版本号大于 Build.VERSION_CODES.O(26)

解决方法

  • 如果当前页面不坚持使用固定屏幕方向
    在这种情况下,我们直接将screenOrientation属性给取消掉,这样就解决了这个问题。
  • 如果当前页面必须固定屏幕方向
    在这种情况下,我们可以将windowIsTranslucent设置为 false 。这样做的话,启动页面时,会有黑屏/白屏的问题。
    对于黑白屏的问题,我们可以通过
    @android:color/transparent
    将背景设置为透明。

你可能感兴趣的:(Only fullscreen opaque activities can request orientation)