最近在提测版本时,测试发现一个奇怪的现象,在一个状态栏透明背景,文字是亮色的页面下,跳转登录,当前界面的状态栏会突然变成白底黑字,然后在跳转过去。
一排查下来,发现状态栏会变成白底黑字,是因为登录时会唤起一个透明的中间页面,执行一键登录的逻辑,而这个透明页面,自然是默认的黑底白字。知道了原因,那就开始动手解决吧。
因为业务需要,跳转之前的页面的状态栏不能修改,那就只能修改透明的中间页面,让其可以适配上一个页面的状态栏配置,这里因为我之前已经做了activity任务栈的维护,详见下面的代码:
application.registerActivityLifecycleCallbacks(object : AbsActivityLifecycleCallback() {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
super.onActivityCreated(activity, savedInstanceState)
addActivity(activity)
}
override fun onActivityDestroyed(activity: Activity) {
super.onActivityDestroyed(activity)
removeActivity(activity)
}
})
这样我就能拿到上一个页面的Activity实例,现在问题变成了如何获取其状态栏背景。一开始我打算根据设置状态栏背景的方法getDecorView().setSystemUiVisibility(visibility)
,反过来找一下getSystemUiVisibility的方法,可惜的是并没有这样的方法。之后想起来之前用过WindowInset解决app嵌入h5页面,唤起软键盘时界面没有正确显示的问题,当时只用了WindowInsetCompat,
而官方在api 30引入了WindowInsetsController,用于替代setSystemUIVisibilty
,另外在core-ktx的1.5.0版本,新添加了WindowInsetsControllerCompat,用于向下兼容。
查看了一下api,WindowInsetsControllerCompat有一个isAppearanceLightStatusBars()
方法,
返回status bar的foreground是不是light,注意这里返回true说明是亮色底,也就是白底黑字,文字颜色是黑色,要获取文字颜色的需要对返回值取反。这样我们就可以通过这个方法来适配页面的状态栏背景。
到此问题就解决了,不过在排查过程中,我发现公司的状态栏管理的工具类的逻辑非常乱,毕竟状态栏这块经历了4.4时期第三方rom支持修改,5.0官方支持,后续新增了新的功能,现在通过WindowInsetsController,控制状态栏,底部栏,软键盘这些控件变得更加简单了,大家赶紧学起来