Android API 级别 30 setSystemBarsAppearance 不会覆盖主题数据

Posted

技术标签:

【中文标题】Android API 级别 30 setSystemBarsAppearance 不会覆盖主题数据【英文标题】:Android API level 30 setSystemBarsAppearance doesn't overwrite theme data 【发布时间】:2021-02-05 10:43:17 【问题描述】:

我拥有 android 11 之前的版本(API 级别 30) <item name="android:windowLightStatusBar">true</item> 在我的主题中设置,并在代码中另外更改(需要时)

fun setLightStatusBar() 
    window?.decorView?.let  it.systemUiVisibility = it.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 
 

fun setDarkStatusBar()
    window?.decorView?.let  it.systemUiVisibility = it.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() 

不过,Android-30 增加了一种新的控制方式

fun setLightStatusBar() 
    window?.insetsController?.setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS)
 

fun setDarkStatusBar()
    window?.insetsController?.setSystemBarsAppearance(0, APPEARANCE_LIGHT_STATUS_BARS)

但我的问题是这不能覆盖主题集值,因此我需要全部使用样式或全部在代码中完成。

我的问题是,这是打算这样还是我在某个地方遗漏了什么?

【问题讨论】:

疯狂的机器人。也不起作用,我只是使用已弃用的 API,一切正常(别无选择)¯_(ツ)_/¯ 【参考方案1】:

我从styles.xml 中删除了<item name="android:windowLightStatusBar">true/false</item>,它工作正常。

【讨论】:

对我不起作用,标志未清除到黑暗状态栏【参考方案2】:

如果您在主题中将 android:windowLightStatusBar 设置为 true,则需要执行已弃用的调用(删除系统 UI 标志)才能使其正常工作。

activity.window.decorView.run 
    systemUiVisibility =
        systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()

似乎WindowInsetsControllersystemUiVisibility 都控制状态栏主题,但机制不同。

【讨论】:

以上是关于Android API 级别 30 setSystemBarsAppearance 不会覆盖主题数据的主要内容,如果未能解决你的问题,请参考以下文章

Android SDK对应API级别以及版本说明

如何在 Android 中更改状态栏图标的颜色?

Android Studio 说 Instant run 被禁用,因为它没有正确的 API 级别

Android系统版本特性(4.4版本--11版本)

Android系统版本特性(4.4版本--11版本)

从 API 级别 < Android 26 (Oreo) 的 RGB 值创建颜色对象