Android 中狀態欄的處理無非兩種,一種是顯示隱藏狀態欄,另外一種是狀態欄字體顏色的修改,之前的寫法都已經廢棄了,來看看最新的版本中應該如何處理吧,
顯示隱藏狀態欄
先來看下之前的寫法吧:
/**
* 設定透明狀態欄
*/
fun Activity.transparentStatusBars() {
val option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
val vis = window.decorView.systemUiVisibility
window.decorView.systemUiVisibility = option or vis
window.statusBarColor = Color.TRANSPARENT
}
這樣看著是沒有什么問題,但是,,,來看下代碼的截圖吧:

發現了沒有,咱們一直使用的方法其實都廢棄了,,,點擊去看下描述:
@deprecated SystemUiVisibility flags are deprecated. Use {@link WindowInsetsController}
可以看到官方讓使用 WindowInsetsController 來替換之前的寫法,其實 WindowInsetsController 是一個介面,可以通過 ViewCompat.getWindowInsetsController 來進行實體化,來看下如何使用吧:
/**
* 設定透明狀態欄
*/
fun Activity.transparentStatusBar() {
val controller = ViewCompat.getWindowInsetsController(window.decorView)
// 隱藏狀態欄
controller?.hide(statusBars())
// 設定狀態欄顏色為透明
window.statusBarColor = Color.TRANSPARENT
}
狀態欄字體顏色修改
同上面一樣,先來看下之前的代碼:
/**
* 狀態欄反色
*/
fun Activity.setAndroidNativeLightStatusBars() {
val decor = window.decorView
if (!isDarkMode()) {
decor.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
} else {
decor.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
}
}
同樣看著沒有問題,來看下代碼的截圖吧:

和上面設定顯示隱藏狀態欄一樣,同樣是使用 WindowInsetsController 來替換之前的寫法:
/**
* 狀態欄反色
*/
fun Activity.setAndroidNativeLightStatusBar() {
val controller = ViewCompat.getWindowInsetsController(window.decorView)
controller?.isAppearanceLightStatusBars = !isDarkMode()
}
上面中的 isDarkMode 是我寫的一個擴展方法,用來判斷當前是否為深色模式,來看下如何實作的吧:
/**
* 獲取當前是否為深色模式
* 深色模式的值為:0x21
* 淺色模式的值為:0x11
* @return true 為是深色模式 false為不是深色模式
*/
fun Context.isDarkMode(): Boolean {
return resources.configuration.uiMode == 0x21
}
輸入法顯示與否
其實官方現在都讓咱們使用 WindowInsetsController 來處理狀態欄或者導航欄,甚至能處理輸入法的顯示與否,只需要更換 hide 和 show 的型別即可:
/**
* 隱藏ime
*/
fun Activity.hideIme() {
val controller = ViewCompat.getWindowInsetsController(window.decorView)
controller?.hide(ime())
}
/**
* 顯示ime
*/
fun Activity.showIme() {
val controller = ViewCompat.getWindowInsetsController(window.decorView)
controller?.show(ime())
}
總結
大家可以購買我的新書《Jetpack Compose:Android全新UI編程》進行閱讀,里面有完整的 Compose 框架供大家學習,
京東購買地址
當當購買地址
呸呸呸,太不要臉了,又在推薦自己的新書,,,
說了這么多還沒放 Github 地址呢:https://github.com/zhujiang521/PlayWeather
如果你在學習或者想要學習關于 Compose 的話,亦或是想學習安卓的小部件,這個專案應該或多或少會對你有點幫助,如果對你有幫助的話,別忘記點個 Star,感激不盡,
其實還有一些細節的東西我沒有說到,大家如果有疑問的話可以在評論區提出來,
先寫到這里吧,再會!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/382030.html
標籤:其他
