android 透明主题 crash,关于crash Only fullscreen activities can request orientation 来源及解决方案...

最近遇到一个奇怪的bug。就是:

当targetSdk>=27并且android SDK版本是26(Android 8.0.0)或者27(Android 8.1.0)时,此时在应用中,如果把一个Activity的主题设置为透明并且屏幕方向固定时,就会crash,如下:

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

现已查明,此为Android 8.0.0和Android 8.1.0的bug(Android 9已修改)。

具体源码如下:

protected void onCreate(@Nullable Bundle savedInstanceState) {

if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);

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

}

}

Android 9已去掉此段代码,证明在Android 9已修复此bug。

如何产生此bug ?举例如下:

比如对Activity设置了主题:android:theme="@android:style/Theme.Translucent.NoTitleBar"

又设置了固定方向:android:screenOrientation="portrait"

或者在代码中设置的固定方向:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

此时,就会报crash :

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

解决方案:

第一种:让主题透明Translucent和Activity固定方向不要同时存在。

第二种:设置targetSdk <27

如果采用第一种方案修改,代码判断如下:

if (activity.getApplicationInfo().targetSdkVersion >= 27 && (Build.VERSION.SDK_INT == 26 || Build.VERSION.SDK_INT == 27)) {

//ToDoSomething

}

此bug 是典型的谷歌程序员的bug ,凭什么不让开发者设置透明和固定方向同时存在?唉,谷歌大爷犯了这个错,咱们开发者也没办法,只能去适配。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部