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

Android Vector的fillColor未随DayNight Mode切换问题

问题分析与解决方案

你的问题核心是应用主题切换后,矢量Drawable的颜色没有正确跟随应用设置的主题,反而沿用了系统主题,这通常是因为Drawable加载时的Context主题不匹配,或者主题切换后组件未正确重启、Drawable缓存未更新导致的。

以下是针对性的解决步骤:

1. 确保使用主题配置后的Context加载Drawable

AppCompatResources.getDrawable()依赖传入的Context的主题配置来解析颜色资源。如果view.context是切换主题前的旧Context(比如组件未重启),就会加载错误主题下的颜色。在数据绑定中,你可以用ContextThemeWrapper确保使用最新主题:

val themedContext = ContextThemeWrapper(view.context, view.context.theme)
val drawable = AppCompatResources.getDrawable(themedContext, drawableRes)

2. 主题切换后必须重启Activity

调用AppCompatDelegate.setDefaultNightMode()后,主题配置不会立即生效,需要重启当前Activity才能让新主题覆盖所有组件的资源解析逻辑。在切换主题的代码末尾添加重启逻辑:

AppCompatDelegate.setDefaultNightMode(nightMode)
// 如果在Activity中
this.recreate()
// 如果在Fragment中
requireActivity().recreate()

3. 清除Drawable缓存

AppCompatResources会缓存已加载的Drawable,旧主题下的Drawable可能仍被复用。在切换主题后主动清除缓存:

AppCompatDelegate.setDefaultNightMode(nightMode)
AppCompatResources.clearDrawableCache()
requireActivity().recreate()

4. 验证矢量Drawable的颜色引用

确认你的矢量Drawable中android:fillColor确实是直接引用@color/icon_color,没有使用系统主题相关的颜色(比如@android:color/white)或者硬编码值。你的当前配置是正确的,但可以再次检查:

<!-- 矢量Drawable中的配置 -->
<vector ...>
    <path android:fillColor="@color/icon_color" .../>
</vector>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:55:22