You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 15 Edge-to-edge enforcement状态栏颜色异常问题咨询

Android 15(targetSDK 35)Edge-to-edge 适配问题解析

核心结论:这不是Bug,是Android 15的预期行为变更

当targetSDK升级到35(对应Android 15)时,系统强制开启Edge-to-edge模式——布局默认会延伸到状态栏和导航栏下方,这和targetSDK34及以下的默认行为完全不同:

  • targetSDK34时,系统会自动给布局添加内边距避免被系统栏遮挡,同时默认沿用主题的colorPrimaryDark作为状态栏背景色;
  • targetSDK35时,系统不再自动处理这些,需要开发者主动适配。

各现象的具体解释

  1. 升级后UI被系统栏遮挡:
    这是Edge-to-edge强制开启的直接结果,布局不再自动预留系统栏空间,自然会被遮挡。

  2. 添加android:fitsSystemWindows="true"后不再遮挡,但状态栏颜色异常:
    fitsSystemWindows="true"的作用是让布局根据系统栏的尺寸自动添加内边距,解决遮挡问题,但它只负责处理padding,不会设置状态栏的背景色或透明度。升级到targetSDK35后,系统不再默认将colorPrimaryDark应用到状态栏,所以状态栏会显示主题默认的浅色(你的主题是Light风格),导致颜色异常。

  3. 用DrawerLayout包裹后状态栏颜色恢复正常:
    AndroidX的DrawerLayout已经内置了Android 15 Edge-to-edge的适配逻辑:

    • 它会自动处理fitsSystemWindows的内边距;
    • 同时会读取主题中的colorPrimaryDark,自动设置为状态栏背景色,还会根据主题风格调整状态栏文字的颜色,符合Material Design规范。

不依赖DrawerLayout的解决方案

你可以通过以下方式修复状态栏颜色问题:

方案1:在主题中直接配置状态栏属性

修改styles.xml,给AppTheme添加状态栏相关属性:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">
    <!-- 保留原有属性 -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="colorControlHighlight">@color/colorControlHighlight</item>
    <item name="colorControlNormal">@color/colorControlNormal</item>
    <item name="itemBackground">@color/gray</item>
    <item name="android:actionOverflowButtonStyle">@style/MyOverflowButtonStyle</item>
    <!-- 添加状态栏配置 -->
    <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    <!-- 状态栏文字颜色:false为浅色(对应深色状态栏),true为深色(对应浅色状态栏) -->
    <item name="android:windowLightStatusBar">false</item>
</style>

方案2:在Activity中通过代码设置

在Activity的onCreate方法中添加代码(Kotlin示例):

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.your_layout)
    
    // 设置状态栏背景色为colorPrimaryDark
    window.statusBarColor = ContextCompat.getColor(this, R.color.colorPrimaryDark)
    // 配置状态栏文字为浅色(适配深色状态栏)
    window.insetsController?.setSystemBarsAppearance(0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
}

内容的提问来源于stack exchange,提问作者Phantom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:20:16