借助WindowInsetsControllerCompat,轻

2023-01-11  本文已影响0人  吴小亮的技术小站

最近在提测版本时,测试发现一个奇怪的现象,在一个状态栏透明背景,文字是亮色的页面下,跳转登录,当前界面的状态栏会突然变成白底黑字,然后在跳转过去。

一排查下来,发现状态栏会变成白底黑字,是因为登录时会唤起一个透明的中间页面,执行一键登录的逻辑,而这个透明页面,自然是默认的黑底白字。知道了原因,那就开始动手解决吧。

因为业务需要,跳转之前的页面的状态栏不能修改,那就只能修改透明的中间页面,让其可以适配上一个页面的状态栏配置,这里因为我之前已经做了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,控制状态栏,底部栏,软键盘这些控件变得更加简单了,大家赶紧学起来

上一篇 下一篇

猜你喜欢

热点阅读