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

在Jetpack Compose中如何加载深色模式Drawable资源?

Jetpack Compose 深浅主题自动加载对应资源失效排查步骤
  • 第一步:校验主题基础配置
    检查theme.xml的父主题是否为Theme.MaterialComponents.DayNight系列主题,禁止使用固定的Light/Dark主题,否则系统不会自动触发-night资源的匹配逻辑。
    你提供的theme.xml内容参考:theme.xml
  • 第二步:校验Compose主题层级与夜间模式参数
    你的所有页面Composable代码必须被自定义的应用主题包裹,且主题要正确读取夜间模式状态,示例代码如下:
    @Composable
    fun YourAppTheme(
        darkTheme: Boolean = isSystemInDarkTheme(),
        content: @Composable () -> Unit
    ) {
        val colorScheme = if (darkTheme) DarkColorScheme else LightColorScheme
        MaterialTheme(
            colorScheme = colorScheme,
            typography = Typography,
            content = content
        )
    }
    
    禁止在主题外层调用painterResource加载图片,此时上下文未绑定主题配置,无法正确匹配资源。
  • 第三步:校验资源文件配置
    参考你提供的资源配置:
    1. 默认drawable资源:drawable ic_daynight
    2. 深色模式drawable资源:drawable-night ic_daynight
    3. 文件夹结构:drawable image
      确认两点:
    • drawable-night文件夹命名无拼写错误
    • 两个文件夹下的资源文件名、大小写完全一致
  • 第四步:清理缓存重新编译
    调试场景下出现的不生效问题,先卸载设备上的应用再重新安装运行,或者清理Android Studio缓存后重新编译:File → Invalidate Caches → 勾选清理文件系统缓存和本地历史 → 重启IDE后重新运行。
  • 第五步:手动切换主题场景适配
    如果你是应用内手动切换深浅模式,不跟随系统配置,切换后需要重启Activity才能触发资源重加载,也可以直接在Compose中根据主题状态手动指定资源:
    val iconRes = if (isSystemInDarkTheme()) R.drawable.ic_daynight_night else R.drawable.ic_daynight_light
    Image(
        modifier = Modifier.align(Alignment.CenterHorizontally),
        painter = painterResource(id = iconRes),
        contentDescription = null
    )
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:36:07