java - 在 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 函数,但不清楚如何从文档中完成此操作。有人可以指出我正确的方向吗?
解决方案
对于 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
计算。
推荐阅读
- python - 根据 pandas Python 中另一个数据帧的条件从一个数据帧中删除行
- reactjs - React-select 多个下拉 onChange 实现
- jenkins - 有没有办法查看詹金斯的工作有多少失败的构建?
- gitlab-ci - 将要持续的 Mkdocs gitlab-ci 模板,为什么要使用变体?
- flutter - “onError”处理程序无法返回“Null”类型的值
- php - Laravel 数据透视表与附加模型
- c++ - 为什么 C++ 中的函数没有 constexpr 参数?
- django - 多个用户使用 django-allauth 注册。两个注册表单未呈现
- ruby-on-rails - 默认 form_with 不远程也不期望通过 JS 响应
- angular - RxJS Angular - 将 Observable 的对象属性作为 Observable 传递