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

