Посилання на інші ресурси не підтримуються генерацією PNG у побудові


130

Плагін AndroidStudio 3.0 / Android Gradle 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: Рішення сумісності з векторними малюнками .


4
Але чому виникає проблема і чи є вищезазначене рішення швидким виправленням чи хорошою стратегією?
Пранайшарма


1
Примітка: useSupportLibrary - неправильне рішення для мене (хв SDK 16, ціль 26), програма запускається при запуску. Мені довелося це видалити, видалити @color з векторів і просто пошукати і замінювати всі android: fillColor = шматки вручну. Він дуже швидко на насправді, займе 10 секунд
djdance

Де я додати цей рядок?
Роймунсон

@ Роймунсон всередині ключа Android. Подивіться на Wonil в відповідь в самій цій темі.
RBT

14

вам потрібно використовувати шістнадцятковий код безпосередньо, не посилаючись на ресурс.

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

1
це версія регресії ... якщо ви хочете змінити колір, ви можете змінювати по черзі ... простіше зробити посилання на кольоровий файл і змінити його.
langme

там, на жаль, це єдиний спосіб зробити так, щоб ваша програма працювала, або вам доведеться знизити версію
Gradle

3
У мене теж є те саме питання. Чому функцію, яка раніше добре працювала, буде відключено? Це, може, помилка?
joaomgcd

Я щойно оновив до AS3 і отримав цю проблему теж. Чому цю функцію буде видалено?
Марті

1
Це працює як вирішення, але "правильна" відповідь - це відповідь @ mwa91, яку слід додати vectorDrawables.useSupportLibrary = trueдо вашого build.gradle.
Шон Барбо

9

Трохи більше контексту для цієї помилки:

  • Android 5.0 (рівень 21 API) був першою версією, яка офіційно підтримувала векторні малюнки.
  • Якщо ви використовуєте minSdkVersion нижче 20, існує два рішення для векторного малювання
    • Векторна студія активів Android Studio генерує PNG. Ознайомтеся з документом Android Studio . Але посилання на інші ресурси не підтримуються генерацією PNG у побудові.
    • Використовуйте бібліотеку підтримки
  • Або використовуйте 21 або вище для minSdkVersion

Для бібліотеки підтримки додайте заяву до файлу 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/dravable/ic_selection_right_widen.xml: Неможливо обробити атрибут android: fillColor = "@ color / kb_key_long_press_available": посилання на інші ресурси не підтримуються генерацією PNG часу вбудовування. Докладні відомості див. У розділі developer.android.com/tools/help/vector-asset-studio.html .
Майк Ханафей

3
@MikeHanafey minSdkVersion має бути 24, лише якщо ви використовуєте android: filltype, який інколи автоматично вводиться Android Vector Asset. Просто позбудьтеся цього.
Симона

1
@Simone Дякую за пропозицію. Це було питання в моєму випадку.
Абдул Рехман Явар Хан

за замовчуванням fillTypeє, nonZeroале він відрізняється лише від evenOddпевних випадків: w3.org/TR/SVG/painting.html#FillRuleProperty
hmac

4

Не використовуйте атрибут colorReference при атрибуті fillColor у векторному малюванні просто використовуйте гекса-код

використовувати так

<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
Це патч, я хочу мати можливість змінити тему свого додатка, не дублюючи всі малюнки, також він створює png замість того, щоб зберігати вектори. Люди повинні використовувати рішення @ mwa91.
Кіківа


0

Мені вдалося обійти це, зробивши наступне:

  1. створіть папку Dravable-v21 та скопіюйте всі ваші драйвові xmls, які використовують там змінні
  2. в оригінальній папці, що малюється, змінити всі значки, щоб використовувати статичний колір

Таким чином буде працювати компілятор


1
Так, ймовірно, тому, що API 21 підтримує Android 5.0 (Lollipop), який підтримує векторні векторні малюнки. Однак на пристроях із більш ранніми версіями тоді можуть взагалі не бути належних зображень: developer.android.com/guide/topics/graphics/…
PointedEars

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 відповіді .

У разі , якщо вам необхідна динамічна тематизация Drawable, але у вас немає часу , щоб оновити свої макети і піти з @ 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"
      />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.