【问题标题】:References to other resources are not supported by build-time PNG generation构建时 PNG 生成不支持对其他资源的引用
【发布时间】:2018-04-09 06:24:54
【问题描述】:

AndroidStudio 3.0 / Android Gradle 插件 3.0

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

我收到此错误:

生成时生成 PNG 不支持对其他资源的引用

是否有可能解决它还是已弃用的解决方案?

【问题讨论】:

标签: android resources android-studio-3.0


【解决方案1】:

要支持 API SDK build.gradle 的 android 块内:

defaultConfig {
   vectorDrawables.useSupportLibrary = true
}

如果您的 minSdkVersion 为 24 或更高,那么您的问题将自行解决,因为 VectorDrawables 从该 API 开始提供全面支持。

详情请见Android Developers: Vector Drawables Backward Compatibility Solution

【讨论】:

  • 但是为什么会出现这个问题,上述解决方案是快速修复还是好的策略?
  • 注意:useSupportLibrary 对我来说是错误的解决方案(最小 SDK 16,目标 26),应用程序在启动时崩溃。我必须删除它,从向量中删除@color,然后手动搜索并替换所有 android:fillColor= 片段。其实挺快的,10秒左右
  • 我在哪里添加这一行?
  • @Roymunson 在 android 键中。看看这个线程本身的 Wonil 的answer
【解决方案2】:

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

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

【讨论】:

  • 它是回归版本...如果要更改颜色,可以逐个更改...在颜色文件中进行参考并更改它更容易。跨度>
  • 不幸的是,这是使您的应用正常运行的唯一方法,否则您必须降级您的 gradle 版本
  • 我也有同样的问题。为什么以前运行良好的功能会被禁用?这可能是一个错误吗?
  • 我刚刚更新到 AS3 也遇到了这个问题。为什么要删除该功能?
  • 这是一种解决方法,但“正确”答案是@mwa91 将vectorDrawables.useSupportLibrary = true 添加到您的build.gradle 的答案。
【解决方案3】:

这个错误的更多上下文:

  • Android 5.0(API 级别 21)是第一个正式支持矢量绘图的版本。
  • 如果使用低于20的minSdkVersion,vector drawable有两种解决方案
    • Android Studio 的 Vector Asset Studio 生成 PNG。请看Android Studio document。但是,生成时生成 PNG 不支持对其他资源的引用。
    • 使用支持库
  • 或者,对 minSdkVersion 使用 21 或更高版本

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

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

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

【讨论】:

  • @MikeHanafey 您能否指出文档为什么 minSdkVersion 必须为 24?谢谢。
  • 除非将 minSdkVersion 增加到 24,否则会出现以下消息。我没有解释,并通过简单地增加值直到 gradle 构建成功来发现这一点。错误:java.lang.RuntimeException:java.lang.RuntimeException:处理时出错./src/main/res/drawable/ic_selection_right_widen.xml:无法处理属性android:fillColor =“@color/kb_key_long_press_available”:对其他的引用构建时 PNG 生成不支持资源。详情请见developer.android.com/tools/help/vector-asset-studio.html
  • @MikeHanafey minSdkVersion 只有在使用 android:filltype 时才必须为 24,有时 Android Vector Asset 会自动放入。去掉它。
  • @Simone 谢谢你的建议。这就是我的问题。
  • 默认 fillTypenonZero 但在某些情况下它仅与 evenOdd 不同:w3.org/TR/SVG/painting.html#FillRuleProperty
【解决方案4】:

不要在 Vector drawable 中的 fillColor 属性中使用 colorReference,只需使用 hexa 代码

这样使用

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

【讨论】:

  • 这是一个补丁,我希望能够在不复制所有可绘制对象的情况下重新为我的应用程序设置主题,而且它正在创建 png 而不是保持矢量。人们应该使用@mwa91 的解决方案。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    我已经能够通过执行以下操作来解决此问题:

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

    这样编译器就可以工作了

    【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      要加起来@mwa91answer

      如果您需要动态主题,但您没有时间更新布局并使用@mwa91 answer 并将所有android:src="@drawable/..." 属性更改为app:srcCompat="@drawable/...",您始终可以使用十六进制颜色drawable 中的值,然后在 ImageView 中为 drawable 着色:

      <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/your_drawable"
            android:tint="@color/image_button_disabled"
            />
      

      【讨论】:

        【解决方案9】:

        删除filltype,警告就会消失。那是因为:

        只有在使用 android:filltype 时,minSdkVersion 必须为 24

        默认的 fillType 是 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-18
          • 2011-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-30
          • 1970-01-01
          • 2017-03-17
          相关资源
          最近更新 更多