การอ้างอิงไปยังแหล่งข้อมูลอื่น ๆ ไม่ได้รับการสนับสนุนโดยการสร้าง PNG เวลาสร้าง


130

AndroidStudio 3.0 / Android Gradle plugin 3.0

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

ฉันได้รับข้อผิดพลาดนี้:

การอ้างอิงไปยังแหล่งข้อมูลอื่นไม่ได้รับการสนับสนุนโดยการสร้าง PNG แบบเวลา

มันจะเป็นไปได้ที่จะแก้ไขหรือเป็นทางออกที่เลิก?


หัวข้อที่เกี่ยวข้อง - อัปเดต Android Studio เป็น 3.0 และรับปัญหานี้ แม้ว่าวิธีแก้ปัญหาจะเหมือนกันทุกประการ
RBT

คำตอบ:


315

หากต้องการสนับสนุน API SDK <24 ให้เพิ่มบรรทัดต่อไปนี้ในแอปของคุณbuild.gradle:

defaultConfig{
   vectorDrawables.useSupportLibrary = true
}

หาก minSdkVersion ของคุณเป็น 24 หรือสูงกว่าปัญหาของคุณจะได้รับการแก้ไขด้วยตัวเองเนื่องจาก VectorDrawables ได้รับการสนับสนุนอย่างเต็มที่โดยเริ่มจาก API นี้

ดูพัฒนา Android: เวกเตอร์ Drawables โซลูชั่นความเข้ากันได้ย้อนหลังเพื่อดูรายละเอียด


4
แต่ทำไมถึงเกิดปัญหาขึ้นและทางออกข้างต้นเป็น quickfix หรือกลยุทธ์ที่ดี?
Pranaysharma


1
หมายเหตุ: useSupportLibrary เป็นวิธีแก้ปัญหาที่ไม่ถูกต้องสำหรับฉัน (ขั้นต่ำ SDK 16, เป้าหมาย 26), แอปขัดข้องเมื่อเริ่มต้น ฉันต้องลบสิ่งนี้ลบ @color จากเวคเตอร์และเพียงแค่ค้นหาและแทนที่ android ทั้งหมด: fillColor = pieces ด้วยตนเอง มันเร็วจริง ๆ ใช้เวลา 10 วินาที
djdance

ฉันจะเพิ่มบรรทัดนี้ที่ไหน
Roymunson

@Roymunson ภายในคีย์ android ดูคำตอบของ Wonil ในชุดข้อความนี้
RBT

14

คุณต้องใช้รหัสฐานสิบหกโดยตรงไม่ได้อ้างอิงถึงทรัพยากร

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

1
มันเป็นรุ่นถดถอย ... ถ้าคุณต้องการเปลี่ยนสีคุณสามารถเปลี่ยนทีละคน ... มันง่ายกว่าที่จะทำการอ้างอิงในไฟล์สีและเปลี่ยนมัน
langme

น่าเสียดายที่นี่เป็นวิธีเดียวที่จะทำให้แอปของคุณใช้งานได้หรือคุณต้องลดรุ่น gradle ของคุณ
Oussema Aroua

3
ฉันก็มีปัญหาเดียวกัน เหตุใดคุณลักษณะที่เคยใช้งานได้ดีจึงถูกปิดการใช้งาน นี่อาจเป็นข้อผิดพลาดหรือไม่?
joaomgcd

ฉันเพิ่งอัปเดตเป็น AS3 และได้รับปัญหานี้เช่นกัน ทำไมคุณสมบัตินั้นจึงถูกลบ?
Marty

1
ผลงานนี้เป็นวิธีแก้ปัญหา แต่ "สิทธิ" คำตอบคือคำตอบ @ mwa91 ของการเพิ่มของคุณvectorDrawables.useSupportLibrary = true build.gradle
Sean Barbeau

9

บริบทเพิ่มเติมเล็กน้อยสำหรับข้อผิดพลาดนี้:

  • Android 5.0 (API ระดับ 21) เป็นเวอร์ชันแรกที่รองรับการวาดภาพเวกเตอร์อย่างเป็นทางการ
  • หากคุณใช้ minSdkVersion ต่ำกว่า 20 มีสองวิธีสำหรับการวาดภาพเวกเตอร์
    • Vector Asset Studio สร้าง PNG กรุณาใช้ดูเอกสาร Android สตูดิโอ แต่การอ้างอิงไปยังแหล่งข้อมูลอื่น ๆ ไม่ได้รับการสนับสนุนโดยการสร้าง PNG ในเวลาทำงาน
    • ใช้ห้องสมุดสนับสนุน
  • หรือใช้ 21 หรือสูงกว่าสำหรับ minSdkVersion

สำหรับไลบรารีสนับสนุนให้เพิ่มคำสั่งไปยังไฟล์ build.gradle ของคุณ:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

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

@MikeHanafey คุณช่วยชี้ให้ฉันดูว่าทำไม minSdkVersion ต้องเป็น 24 ขอบคุณ
Wonil

ข้อความด้านล่างนี้เกิดขึ้นเว้นแต่ว่า 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 แบบ build-time ดูdeveloper.android.com/tools/help/vector-asset-studio.htmlสำหรับรายละเอียด
Mike Hanafey

3
@MikeHanafey minSdkVersion ต้องเป็น 24 เท่านั้นหากคุณใช้ android: filltype ซึ่งบางครั้งสินทรัพย์ Android Vector จะใส่โดยอัตโนมัติเพียงแค่กำจัดมัน
Simone

1
@Simone ขอบคุณสำหรับคำแนะนำ นั่นคือปัญหาในกรณีของฉัน
Abdul Rehman Yawar Khan

ค่าเริ่มต้นfillTypeคือnonZeroแต่จะแตกต่างจากevenOddในบางกรณี: w3.org/TR/SVG/painting.html#FillRuleProperty
hmac

4

อย่าใช้ colorReference ที่แอตทริบิวต์ fillColor ใน Vector drawable เพียงใช้รหัส 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"/>


2
นี่คือแพทช์ฉันต้องการที่จะสามารถจัดธีมแอปของฉันอีกครั้งโดยไม่ทำซ้ำ drawable ทั้งหมดรวมถึงมันกำลังสร้าง png แทนที่จะเก็บภาพเวกเตอร์ ผู้ใช้ควรใช้โซลูชันของ @ mwa91
Kikiwa

4

หาก 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


0

ฉันสามารถแก้ไขสิ่งนี้ได้โดยทำสิ่งต่อไปนี้:

  1. สร้างโฟลเดอร์ drawable-v21 และคัดลอก xml ที่สามารถดึงได้ทั้งหมดของคุณที่ใช้ตัวแปรที่นั่น
  2. ในโฟลเดอร์ drawable ดั้งเดิมเปลี่ยนไอคอนทั้งหมดเพื่อใช้สีคงที่

วิธีรวบรวมนี้จะทำงาน


1
ใช่อาจเป็นเพราะ API 21 รองรับ Android 5.0 (Lollipop) ซึ่งรองรับการเขียนแบบเวกเตอร์ได้ อย่างไรก็ตามอุปกรณ์ที่มีเวอร์ชั่นก่อนหน้านี้อาจไม่มีภาพที่เหมาะสมเลย: developer.android.com/guide/topics/graphics/
......

0

ฉันคิดว่าคุณกำลังใช้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"


0

ที่จะเพิ่มขึ้นถึง@ mwa91 คำตอบ

ในกรณีที่คุณต้องการการดึงแบบไดนามิก แต่คุณไม่มีเวลาอัปเดตเลย์เอาท์ของคุณและไปกับ@ mwa91 คำตอบและเปลี่ยนandroid:src="@drawable/..."คุณลักษณะทั้งหมดเป็นapp:srcCompat="@drawable/..."คุณสามารถใช้ค่าสีฐานสิบหกใน drawable และจากนั้นระบายสีอ่อนใน ImageView ในภายหลัง:

<ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/your_drawable"
      android:tint="@color/image_button_disabled"
      />
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.