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

Android 15下Jetpack Compose应用状态栏图标不可见的修复方案

解决Android 15状态栏图标在浅色模式下不可见的问题

问题原因

Android 15默认启用边缘到边缘布局,状态栏变为透明。你的应用浅色模式下背景为白色,但状态栏图标未自动切换为深色,导致视觉冲突;而深色模式下背景为黑色,图标白色正常显示。

解决方案

1. 在Compose主题中添加状态栏外观配置

通过SideEffect结合WindowCompat,根据当前主题模式动态切换状态栏图标的亮度:

修改你的AutoSilentTheme代码,添加状态栏适配逻辑:

import androidx.core.view.WindowCompat
import android.view.Window
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Color

private val DarkColorScheme = darkColorScheme(
    primary = BlueLight,
    secondary = Blue,
    tertiary = Blue,
    background = Black
)

private val LightColorScheme = lightColorScheme(
    primary = Blue,
    secondary = BlueLight,
    tertiary = BlueLight,
    background = Color.White // 明确设置浅色背景,可选但建议
)

@Composable
fun AutoSilentTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    window: Window? = null, // 传入Activity的window对象
    content: @Composable () -> Unit
) {
    val colorScheme = if (darkTheme) DarkColorScheme else LightColorScheme

    // 配置状态栏图标颜色
    window?.let {
        SideEffect {
            val insetsController = WindowCompat.getInsetsController(it, it.decorView)
            // 浅色模式下状态栏图标设为深色,深色模式下设为浅色
            insetsController.isAppearanceLightStatusBars = !darkTheme
            // 可选:若要恢复灰色状态栏背景,取消下方注释
            // it.statusBarColor = if (darkTheme) Black.toArgb() else Color.Gray.toArgb()
        }
    }

    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography,
        content = content
    )
}

2. 在Activity中传入Window对象

在主Activity中调用主题时,传入当前Window:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge() // 显式启用边缘到边缘,适配Android 15默认行为
        setContent {
            AutoSilentTheme(window = window) {
                // 你的应用内容
            }
        }
    }
}

3. 可选:恢复非透明状态栏(若不需要边缘到边缘)

如果你不想使用Android 15的透明状态栏,可在Activity中强制设置状态栏背景色:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 关闭边缘到边缘,恢复传统状态栏布局
    WindowCompat.setDecorFitsSystemWindows(window, true)
    // 设置状态栏背景色
    window.statusBarColor = if (isSystemInDarkTheme()) Black.toArgb() else Color.Gray.toArgb()
    setContent {
        AutoSilentTheme {
            // 你的应用内容
        }
    }
}

关键说明

  • isAppearanceLightStatusBars设为true时,状态栏图标为深色;设为false时为浅色,完美匹配明暗主题的视觉需求。
  • 明确设置LightColorScheme的background属性,有助于系统更准确识别主题亮度,避免适配异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:46:08