Tham chiếu đến các tài nguyên khác không được hỗ trợ bởi thế hệ PNG thời gian xây dựng


130

Plugin AndroidStudio 3.0 / Android Gradle 3.0

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

Tôi nhận được lỗi này:

tham chiếu đến các tài nguyên khác không được hỗ trợ bởi thế hệ PNG thời gian xây dựng

Nó sẽ có thể giải quyết nó hay nó là một giải pháp không dùng nữa?


Chủ đề liên quan - Cập nhật Android Studio lên 3.0 và gặp sự cố này . Mặc dù giải pháp là hoàn toàn giống nhau.
RBT

Câu trả lời:


315

Để hỗ trợ API SDK <24 thêm dòng sau vào ứng dụng của bạn build.gradle:

defaultConfig{
   vectorDrawables.useSupportLibrary = true
}

Nếu minSdkVersion của bạn từ 24 trở lên, thì vấn đề của bạn sẽ tự giải quyết, vì VectorDrawables có hỗ trợ đầy đủ bắt đầu với API này.

Xem Nhà phát triển Android: Giải pháp tương thích ngược Vector Drawables để biết chi tiết.


4
Nhưng tại sao vấn đề lại xuất hiện và giải pháp trên là một chiến lược nhanh hay một chiến lược tốt?
Pranaysharma


1
lưu ý: useSupportL Library là giải pháp sai đối với tôi (tối thiểu SDK 16, mục tiêu 26), ứng dụng gặp sự cố khi bắt đầu. Tôi đã phải xóa cái này, xóa @color khỏi các vectơ và chỉ cần tìm kiếm và thay thế tất cả android: fillColor = Pieces bằng tay. Nó thực sự rất nhanh, mất 10 giây
djdance

Tôi thêm dòng này vào đâu?
Roymunson

@Roymunson bên trong khóa android. Nhìn vào câu trả lời của Wonil trong chủ đề này.
RBT

14

bạn cần sử dụng mã hex trực tiếp không tham chiếu đến tài nguyên.

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

1
đó là phiên bản hồi quy ... nếu bạn muốn thay đổi màu sắc, bạn có thể thay đổi từng cái một ... sẽ dễ dàng hơn để tạo một tham chiếu trong tệp màu và thay đổi nó.
langme

thật không may, đây là cách duy nhất để làm cho ứng dụng của bạn hoạt động hoặc bạn phải hạ cấp phiên bản cấp độ của bạn
Oussema Aroua

3
Tôi cũng có vấn đề tương tự. Tại sao một tính năng trước đây hoạt động tốt sẽ bị vô hiệu hóa? Đây có phải là một lỗi?
joaomgcd

Tôi vừa cập nhật lên AS3 và cũng gặp vấn đề này. Tại sao tính năng đó sẽ bị xóa?
Marty

1
Điều này hoạt động như một cách giải quyết, nhưng câu trả lời "đúng" là câu trả lời của @ mwa91 để thêm vectorDrawables.useSupportLibrary = truevào của bạn build.gradle.
Sean Barbeau

9

Thêm một chút bối cảnh cho lỗi này:

  • Android 5.0 (API cấp 21) là phiên bản đầu tiên chính thức hỗ trợ các bản vẽ vector.
  • Nếu bạn sử dụng minSdkVersion thấp hơn 20, có hai giải pháp cho vector có thể vẽ
    • Vector Studio Asset Studio của Android Studio tạo PNG. Vui lòng xem tài liệu Android Studio . Nhưng, các tham chiếu đến các tài nguyên khác không được hỗ trợ bởi thế hệ PNG thời gian xây dựng.
    • Sử dụng thư viện hỗ trợ
  • Hoặc, sử dụng 21 trở lên cho minSdkVersion

Đối với thư viện hỗ trợ, hãy thêm một câu lệnh vào tệp build.gradle của bạn:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

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

@MikeHanafey Bạn có thể vui lòng chỉ ra doc tại sao minSdkVersion phải là 24 không? Cảm ơn.
Wonil

Thông báo dưới đây xảy ra trừ khi minSdkVersion được tăng lên 24. Tôi không có lời giải thích và đã tìm thấy điều này bằng cách tăng giá trị cho đến khi việc xây dựng lớp thành công. Error: java.lang.R nbException: java.lang.R nbException: Lỗi trong khi xử lý tài nguyên không được hỗ trợ bởi thế hệ PNG thời gian xây dựng. Xem developer.android.com/tools/help/vector-asset-studio.html để biết chi tiết.
Mike Hanafey

3
@MikeHanafey minSdkVersion phải là 24 chỉ khi bạn sử dụng android: filltype, đôi khi Tài sản Vector Android tự động đưa vào. Chỉ cần thoát khỏi nó.
Simone

1
@Simone Cảm ơn bạn đã gợi ý. Đó là vấn đề trong trường hợp của tôi.
Abdul Rehman Yawar Khan

mặc định fillTypenonZeronhưng nó chỉ khác với evenOddtrong một số trường hợp nhất định: w3.org/TR/SVG/painting.html#FillRuleProperty
hmac

4

Không sử dụng colorReference tại thuộc tính fillColor trong Vector drawable, chỉ sử dụng mã hexa

sử dụng như thế này

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

thay vì điều này

<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
Đây là một bản vá, tôi muốn có thể tái chủ đề ứng dụng của mình mà không cần sao chép tất cả các bản vẽ, nó cũng tạo ra png thay vì giữ véc tơ. Mọi người nên sử dụng giải pháp của @ mwa91.
Kikiwa


0

Tôi đã có thể giải quyết vấn đề này bằng cách làm như sau:

  1. tạo thư mục drawable-v21 và sao chép tất cả các xml có thể vẽ của bạn sử dụng các biến ở đó
  2. trong thư mục gốc có thể vẽ, thay đổi tất cả các biểu tượng để sử dụng màu tĩnh

Bằng cách này, trình biên dịch sẽ làm việc


1
Có, có lẽ vì API 21 hỗ trợ Android 5.0 (Lollipop) hỗ trợ các bản vẽ vector nguyên bản. Tuy nhiên, các thiết bị có phiên bản cũ hơn có thể không có hình ảnh phù hợp nào cả: developer.android.com/guide/topics/graphics/
mẹo

0

Tôi nghĩ rằng bạn đang sử dụng android:fillColor="@color/image_button_disabled"mã này cho vector drawable.

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

Nó không được hỗ trợ.

Chỉ cần thay thế nó bằng android:fillColor="#c4ca5e"


0

Để thêm vào câu trả lời @ mwa91 .

Trong trường hợp bạn cần chủ đề động của drawable, nhưng bạn không có thời gian để cập nhật bố cục của mình và đi với câu trả lời @ mwa91 và thay đổi tất cả các thuộc tính thành , bạn luôn có thể sử dụng giá trị màu hex trong drawable và sau đó nhuốm màu drawable trong ImageView:android:src="@drawable/..."app:srcCompat="@drawable/..."

<ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/your_drawable"
      android:tint="@color/image_button_disabled"
      />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.