首页 > 解决方案 > 主题属性无法与 VectorDrawable 一起正常工作

问题描述

我使用最小 sdk 版本 21 开发支持多主题(深色和浅色)的应用程序。我发现可以在 VectorDrawable 中使用主题属性(例如?attr/logo_color)。

例如,如果我将主题属性设置为填充所需路径的颜色

<vector ...>
<path 
     android:pathData="..."
     android:fillColor="?attr/logo_color"/>
</vector>

或将主题属性设置为对整个矢量进行着色

<vector android:tint="?attr/logo_color">
...
</vector>

我运行应用程序(浅色主题),它正确设置了颜色,但是当我更改主题 Activity.setTheme() (从浅色到深色)时,颜色不会改变。颜色总是“缓存”到以前主题的颜色。有趣的是,这不适用于棒棒糖和棉花糖,但在 Android 10 上它会正确更改。

另一方面,如果我在ImageView中设置android:tint="" color

<ImageView
            ...
            app:srcCompat="@drawable/ic_logo"
            android:tint="?attr/logo_colo"/>

它适用于所有版本,但它当然会改变整个可绘制对象的颜色。

是否有任何错误,或者是否可以在运行时主题更改的较低 api 上使用 VectorDrawable 中的主题属性?

标签: androidandroid-vectordrawable

解决方案


面临同样的问题,我所做的是以下事情

  1. build.gradle文件(应用程序级别)中,设置以下内容(建议这一点,因为您没有提到您支持的 minSdk 是什么)
android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}
  1. 如果您在运行时或动态地将此类可绘制对象设置为任何类型的视图,那么

而不是这个(现在已弃用)

context.getResources().getDrawable(/*Your resource id*/)

用这个

ContextCompat.getDrawable(context, /*Your resource id*/)

ExplanationContextCompat该类所做的是确保您获得的可绘制对象符合您的应用程序中当前使用的任何主题(Android 5.0+)如果您甚至支持低于该主题,那么您可以使用 aContextThemeWrapper来包装您当前的上下文并应用可绘制的特定主题,然后随时使用它

好东西要读

Jorge Castillo 关于 ContextThemeWrapper 的文章


推荐阅读