首页 > 解决方案 > 在 Android 11 (API 30) 中以编程方式更改状态栏文本颜色

问题描述

我目前能够在我的基本活动中使用以下内容将状态栏文本颜色从浅色更新为深色:

private fun toggleStatusBarTextColor(light: Boolean) {
    // clear any existing flags
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
    if(light) {
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    } else {
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
    }
}

systemUiVisibility 现在在 API 30 上显示为已弃用,尽管已弃用的方法暂时仍会起作用,但我更愿意用更新的方法替换它们来实现这一点。我已经读到我们现在应该使用 WindowInsetsController 函数,但不清楚如何从文档中完成此操作。有人可以指出我正确的方向吗?

标签: javaandroidkotlinandroid-themeandroid-statusbar

解决方案


对于 API 30,您可以使用WindowInsetsController.setSystemBarsAppearance (int appearance, int mask)

要使状态栏亮起:

window.insetsController?.setSystemBarsAppearance(
        WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
        WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
)

要清除标志:

window.insetsController?.setSystemBarsAppearance(
        0,
        WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
)

请注意,这getInsetsController是可以为空的,因此?检查。

或者(对于较低的 API),您可以使用WindowInsetControllerCompat

val windowInsetController = ViewCompat.getWindowInsetsController(window.decorView)
windowInsetController?.isAppearanceLightStatusBars = true // or false

注意:如果清除标志不起作用检查值window.decorView.windowSystemUiVisibility- 如果它包含View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR这意味着您的视图层次结构包含带有此标志的视图,该标志被传播并影响systemUiVisibility计算。


推荐阅读