android 透明主题 crash,Android兼容性优化-Android 8.0设置Activity透明主题崩溃

崩溃日志:

1 java.lang.RuntimeException:Unable to start activity ComponentInfo{com.pxwx.assistant/com.pxwx.main.ui.MainActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

2 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)

3 ......

4 Caused by:

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

6 android.app.Activity.onCreate(Activity.java:1038)

7 androidx.core.app.ComponentActivity.onCreate(Unknown Source:0)

8 androidx.activity.ComponentActivity.onCreate(Unknown Source:0)

9 androidx.fragment.app.FragmentActivity.onCreate(Unknown Source:99)

10 androidx.appcompat.app.AppCompatActivity.onCreate(Unknown Source:10)

11 com.pxwx.base.activity.BaseActivity.onCreate(Unknown Source:0)

12 com.pxwx.main.ui.MainActivity.onCreate(Native Method)

13 android.app.Activity.performCreate(Activity.java:7183)

14 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1221)

15 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)

16 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)

17 android.app.ActivityThread.-wrap11(Unknown Source:0)

18 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)

19 android.os.Handler.dispatchMessage(Handler.java:105)

20 android.os.Looper.loop(Looper.java:164)

21 android.app.ActivityThread.main(ActivityThread.java:6942)

22 java.lang.reflect.Method.invoke(Native Method)

23 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)

24 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

抛出异常信息:

Only fullscreen opaque activities can request orientation

Android8.0源码Activity.java:

protected void onCreate(@Nullable Bundle savedInstanceState){ if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState); if (getApplicationInfo().targetSdkVersion > O && mActivityInfo.isFixedOrientation()) { final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window); final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta); ta.recycle(); //如果Activity方向固定并且是透明(或者浮动),则会抛异常。 if (isTranslucentOrFloating) { throw new IllegalStateException( "Only fullscreen opaque activities can request orientation"); } } ... }

查看ActivityInfo.java的isTranslucentOrFloating()方法:

https://www.androidos.net.cn/...

//检查Activity方式是否是透明或者是浮动的

public static boolean isTranslucentOrFloating(TypedArray attributes){ final boolean isTranslucent = attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsTranslucent, false); final boolean isSwipeToDismiss = !attributes.hasValue( com.android.internal.R.styleable.Window_windowIsTranslucent) && attributes.getBoolean( com.android.internal.R.styleable.Window_windowSwipeToDismiss, false); final boolean isFloating = attributes.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating, false); return isFloating || isTranslucent || isSwipeToDismiss; }

解决方法:

1、降级targetSDKVersion到26以下(废话!!)

2、移除mainfest文件里的screenOrientation属性

3、取消Activity主题里的windowIsTranslucent属性或者windowSwipeToDismiss属性或者windowIsFloating属性(根据你设置了什么属性来具体分析)

==4、移除manifest文件里的screenOrientation属性,并在Activity的onCreate方法里设置屏幕方向==

if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

关注我的技术公众号

1460000038273199

文章来源: segmentfault.com,作者:heiyl,版权归原作者所有,如需转载,请联系作者。

原文链接:segmentfault.com/a/1190000038370018

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值