android - 主题属性无法与 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 中的主题属性?
解决方案
面临同样的问题,我所做的是以下事情
- 在
build.gradle
文件(应用程序级别)中,设置以下内容(建议这一点,因为您没有提到您支持的 minSdk 是什么)
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
- 如果您在运行时或动态地将此类可绘制对象设置为任何类型的视图,那么
而不是这个(现在已弃用)
context.getResources().getDrawable(/*Your resource id*/)
用这个
ContextCompat.getDrawable(context, /*Your resource id*/)
Explanation
:ContextCompat
该类所做的是确保您获得的可绘制对象符合您的应用程序中当前使用的任何主题(Android 5.0+)如果您甚至支持低于该主题,那么您可以使用 aContextThemeWrapper
来包装您当前的上下文并应用可绘制的特定主题,然后随时使用它
好东西要读
推荐阅读
- c# - Microsoft Graph SDK 中的默认重试处理程序是否会在发送请求之前检查终结点是否受到限制?
- python - 通过在 for 循环中添加迭代值作为后缀来重命名数据框名称(Python)
- angular - Angualr材料创建具有动态列和具有多个选项的列的mat-table
- python - zfit中直方图的PDF?
- c++ - 函数的返回类型可以依赖于作为输入的字符串的内容吗?
- php - 我可以对每一行运行单独的查询,而不是使用单个查询打印所有数据吗?
- python - 在Python中将函数的返回值传递给子进程
- qt - CMake,QT Creator - 项目栏不显示文件夹
- mysql - MySQL 触发器创建执行没有语法错误但没有创建触发器,其他执行失败
- python - 计算数组的 n 个等长列表的平方差