targetSdkVersion
を27
に上げた途端にクラッシュしました。
公式でこういう仕様になりましたよとかなかったような気がするのですが、見落としていたのでしょうか。
原因
クラッシュする直接の原因は下記のActivity#onCreate
内にある部分です。
1 2 3 4 5 6 7 8 9 10 11 |
Activity.java if (getApplicationInfo().targetSdkVersion >= O_MR1 && mActivityInfo.isFixedOrientation()) { final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window); final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta); ta.recycle(); if (isTranslucentOrFloating) { throw new IllegalStateException("Only fullscreen opaque activities can request orientation"); } } |
targetSdkVersion
以上 かつ isFixedOrientation(Activityの回転が固定されているかどうか)で、
さらに、isTranslucentOrFloating(StyleでwindowIsTranslucent=true)にしているとIllegalStateException
を投げるという仕様のようです。
つまりTranslucentやFloating(初めて見た)の状態のときは、画面を固定してはイケナイよ、ということのようです。
解決方法
StackOverFlowなどを見ると、ManifestからscreenOrientation
を消せ、と書いてあるんだけど、それじゃ回転してしまうじゃないかということで、
Styleから<item name="android:windowIsTranslucent">true</item>
を使わない方法で行くしか無いのかなと。
1 2 3 4 5 6 7 8 9 |
styles.xml <style name="TranslucentTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:windowNoTitle">true</item> <item name="android:windowActionBar">false</item> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> </style> |
StackOverFlowにもありますが、上記のやり方である程度は補えるかなと思います。
ただ、僕の場合<item name="android:windowIsTranslucent">true</item>
を消すだけで問題なさそうだったので、
上記のやり方は簡単に試したのみでじっくり見てません。あしからず。参考になれば嬉しいです。