Android将targetApi升级到35后如何修改状态栏颜色
Android将targetApi升级到35后如何修改状态栏颜色
刚把项目targetSdk升到35,解决完布局和状态栏重叠的问题后,也卡过状态栏颜色修改的坑,来分享几个实测有效的方法,都是在Android 15真机上跑通的~
推荐方法:用WindowInsetsControllerCompat(兼容新旧版本)
这个是AndroidX提供的工具类,完美适配API21到API35,还能顺便控制状态栏图标的明暗,避免颜色冲突导致图标看不清。
在Activity的onCreate方法(或者Fragment的onViewCreated)里加这段代码:
// 确保项目依赖了androidx.core:core-ktx或androidx.appcompat:appcompat val window = this.window val insetsController = WindowInsetsControllerCompat(window, window.decorView) // 第一步:设置状态栏背景颜色 window.statusBarColor = ContextCompat.getColor(this, R.color.your_custom_status_bar_color) // 第二步:按需设置状态栏图标颜色(可选但关键) // true = 图标和文字为深色(适配浅色状态栏);false = 图标和文字为浅色(适配深色状态栏) insetsController.isAppearanceLightStatusBars = true
如果是在Fragment中调用,把this.window替换成requireActivity().window即可。
原生API35+专属写法(可选)
如果只需要适配Android 15及以上版本,也可以直接用系统原生属性设置,核心逻辑和上面一致:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { // API35对应Android 15 // 设置状态栏颜色 window.attributes.statusBarColor = ContextCompat.getColor(this, R.color.your_status_bar_color) // 设置状态栏图标明暗 window.attributes.isLightStatusBar = true } else { // 兼容旧版本的 fallback 写法 window.statusBarColor = ContextCompat.getColor(this, R.color.your_status_bar_color) ViewCompat.getWindowInsetsController(window.decorView)?.isAppearanceLightStatusBars = true }
注意事项
- 如果你之前为解决布局重叠问题用了
android:fitsSystemWindows="true",或者通过WindowInsetsListener处理了内边距,这些设置不会和状态栏颜色修改冲突,两者可以共存。 - 若要全局统一设置状态栏颜色,可在
styles.xml里配置,但动态代码设置的优先级更高(适合不同页面用不同颜色的场景):
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="android:statusBarColor">@color/default_status_bar_color</item> <item name="android:windowLightStatusBar">true</item> <!-- 全局设置图标颜色 --> </style>
- 避免使用已废弃的方法,比如
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS(API35下可能出现异常行为),尽量用Insets相关API处理状态栏与布局的交互。
内容来源于stack exchange
相关产品推荐
相关产品推荐

