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
相关产品推荐
相关产品推荐

