References to other resources are not supported by build-time PNG generation

AndroidStudio 3.0 / Android Gradle plugin 3.0

<vector>
<path android:fillColor="@color/image_button_disabled"/>
</vector>

I get this error:

references to other resources are not supported by build-time PNG generation

Will it be possible to resolve it or is it a deprecated solution?

51406 次浏览

您需要直接使用十六进制代码,而不是引用资源。

<vector
<path
android:fillColor="#FFF"/></vector>

我可以通过以下方法来解决这个问题:

  1. 创建一个可绘制的 -v21文件夹,复制所有使用变量的可绘制 XML
  2. 在原始可绘制文件夹中更改所有图标使用静态颜色

这样编译器就可以工作了

为了支持 API SDK < 24,在 android块内的应用程序 build.gradle中添加以下代码行:

defaultConfig {
vectorDrawables.useSupportLibrary = true
}

如果 minSdkVersion 是24或更高版本,那么您的问题将自行解决,因为从这个 API 开始,VectorDrawables 就得到了完全的支持。

详情请参阅 Android 开发者: 矢量绘图向下兼容解决方案

矢量绘图中不要使用 ColorReference at filColor 属性,只需使用六进制代码即可

像这样使用

<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"/>

这个错误的更多上下文:

  • Android 5.0(API 级别21)是第一个正式支持矢量绘图的版本。
  • 如果您使用的 minSdkVersion 小于20,则有两种矢量绘制解决方案
    • Android Studio 的矢量资产工作室生成 PNG。请看一下 Android Studio 文档。但是,构建时 PNG 生成不支持对其他资源的引用。
    • 使用支持库
  • 或者,对 minSdkVersion 使用21或更高版本

对于支持库,在 build.gradle 文件中添加一条语句:

android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}


dependencies {
compile 'com.android.support:appcompat-v7:23.2.0'
}

如果 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

我认为你正在使用 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"
/>

移除 填充类型,警告就会消失,这是因为:

只有在使用 android: fill type 时,minSdkVersion 才必须是24

默认的 filType 是 nonZero,但它只在某些情况下与 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