最近在提測(cè)版本時(shí)酒奶,測(cè)試發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象蚁孔,在一個(gè)狀態(tài)欄透明背景,文字是亮色的頁面下惋嚎,跳轉(zhuǎn)登錄杠氢,當(dāng)前界面的狀態(tài)欄會(huì)突然變成白底黑字,然后在跳轉(zhuǎn)過去另伍。
一排查下來鼻百,發(fā)現(xiàn)狀態(tài)欄會(huì)變成白底黑字,是因?yàn)榈卿洉r(shí)會(huì)喚起一個(gè)透明的中間頁面摆尝,執(zhí)行一鍵登錄的邏輯温艇,而這個(gè)透明頁面,自然是默認(rèn)的黑底白字堕汞。知道了原因勺爱,那就開始動(dòng)手解決吧。
因?yàn)闃I(yè)務(wù)需要讯检,跳轉(zhuǎn)之前的頁面的狀態(tài)欄不能修改琐鲁,那就只能修改透明的中間頁面卫旱,讓其可以適配上一個(gè)頁面的狀態(tài)欄配置,這里因?yàn)槲抑耙呀?jīng)做了activity任務(wù)棧的維護(hù)围段,詳見下面的代碼:
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)
}
})
這樣我就能拿到上一個(gè)頁面的Activity實(shí)例顾翼,現(xiàn)在問題變成了如何獲取其狀態(tài)欄背景。一開始我打算根據(jù)設(shè)置狀態(tài)欄背景的方法getDecorView().setSystemUiVisibility(visibility)
奈泪,反過來找一下getSystemUiVisibility的方法适贸,可惜的是并沒有這樣的方法。之后想起來之前用過WindowInset解決app嵌入h5頁面涝桅,喚起軟鍵盤時(shí)界面沒有正確顯示的問題取逾,當(dāng)時(shí)只用了WindowInsetCompat,
而官方在api 30引入了WindowInsetsController,用于替代setSystemUIVisibilty
苹支,另外在core-ktx的1.5.0版本砾隅,新添加了WindowInsetsControllerCompat,用于向下兼容。
查看了一下api债蜜,WindowInsetsControllerCompat有一個(gè)isAppearanceLightStatusBars()
方法,
返回status bar的foreground是不是light,注意這里返回true說明是亮色底晴埂,也就是白底黑字,文字顏色是黑色寻定,要獲取文字顏色的需要對(duì)返回值取反儒洛。這樣我們就可以通過這個(gè)方法來適配頁面的狀態(tài)欄背景。
到此問題就解決了狼速,不過在排查過程中琅锻,我發(fā)現(xiàn)公司的狀態(tài)欄管理的工具類的邏輯非常亂,畢竟?fàn)顟B(tài)欄這塊經(jīng)歷了4.4時(shí)期第三方rom支持修改向胡,5.0官方支持恼蓬,后續(xù)新增了新的功能,現(xiàn)在通過WindowInsetsController僵芹,控制狀態(tài)欄处硬,底部欄,軟鍵盤這些控件變得更加簡(jiǎn)單了拇派,大家趕緊學(xué)起來