/Android Gradle plugin 3.0
<vector>
<path android:fillColor="@color/image_button_disabled"/>
</vector>
我收到此错误:
生成时 PNG 不支持对其他资源的引用
是否可以解决它,或者它是一个已弃用的解决方案?
若要支持 API SDK <24,请将以下行添加到android
块内的应用build.gradle
:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
如果您的 minSdkVersion 为 24 或更高版本,那么您的问题将自行解决,因为 VectorDrawables 从此 API 开始提供完全支持。
有关详细信息,请参阅 Android 开发人员:矢量可绘制对象向后兼容性解决方案。
直接使用十六进制代码,而不是引用资源。
<vector
<path
android:fillColor="#FFF"/></vector>
此错误的更多上下文:
- Android 5.0(API 级别 21)是第一个正式支持矢量可绘制对象的版本。
- 如果使用低于 20 的 minSdkVersion,则矢量可绘制对象有两种解决方案
- Android Studio的Vector Asset Studio生成PNG。请看一下 Android Studio 文档。但是,生成时 PNG 不支持对其他资源的引用。
- 使用支持库
- 或者,将 21 或更高版本用于 minSdkVersion
对于支持库,请在 build.gradle 文件中添加一条语句:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
compile 'com.android.support:appcompat-v7:23.2.0'
}
不要在矢量可绘制对象中的填充颜色属性中使用颜色引用,只需使用六进制代码
像这样使用
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#1abc9c"
android:pathData="M9,11L7,11v2h2v-2zM13,11h-2v2h2v-2zM17,11h-2v2h2v-2zM19,4h-1L18,2h-2v2L8,4L8,2L6,2v2L5,4c-1.11,0 -1.99,0.9 -1.99,2L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM19,20L5,20L5,9h14v11z"/>
而不是这个
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@color/colorPrimary"
android:pathData="M9,11L7,11v2h2v-2zM13,11h-2v2h2v-2zM17,11h-2v2h2v-2zM19,4h-1L18,2h-2v2L8,4L8,2L6,2v2L5,4c-1.11,0 -1.99,0.9 -1.99,2L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM19,20L5,20L5,9h14v11z"/>
如果您的 minSdkVersion 是 21,您可以通过添加以下行来禁用 PNG 的生成:
// set to an empty list to disable the feature
vectorDrawables.generatedDensities = []
删除此行仍将生成 PNG。
源:http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.VectorDrawablesOptions.html
我已经能够通过执行以下操作来解决此问题:
- 创建一个可绘制对象
- v21 文件夹,并复制所有使用变量的可绘制对象 XML。
- 在原始可绘制对象文件夹中,将所有图标更改为使用静态颜色
这样编译器就可以工作了
我认为您正在android:fillColor="@color/image_button_disabled"
此代码用于矢量可绘制对象。
// image_button_disabled.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/circular_image_color_pressed" android:state_pressed="true" />
<item android:color="@color/circular_image_color_normal" />
</selector>
它不受支持。
只需将其替换为android:fillColor="#c4ca5e"
加起来@mwa91答案。
如果您需要可绘制对象的动态主题,但您没有时间更新布局并使用@mwa91答案并将所有android:src="@drawable/..."
属性更改为app:srcCompat="@drawable/..."
,则始终可以在可绘制对象中使用十六进制颜色值,然后在 ImageView 中对可绘制对象进行着色:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/your_drawable"
android:tint="@color/image_button_disabled"
/>
删除填充类型,警告将消失。这是因为:
minSdkVersion 必须为 24 仅当您使用 android:filltype 时
默认的 fillType 是非零的,但在某些情况下它只与 evenOdd 不同
当然,请确保您不需要填充类型。在某些情况下,它可能会影响矢量可绘制对象的外观。如果您的图标很简单,您很可能不需要它。它有时会自动添加,例如当您从 SVG 导入矢量可绘制对象时。
查看此页面以获取其功能的说明 w3.org/TR/SVG/painting.html#FillRuleProperty
功劳归于@Simone和@hmac
<小时 />一个简单的替代方法是直接使用颜色值,而不是使用颜色引用。
android:fillColor="#FF00AABB" // use this
android:fillColor="@color/image_button_disabled" // instead of this
另一种选择是设置这个,但我宁愿避免它:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
最后的替代方案是 increase your minSdkVersion to 24
.