Les références à d'autres ressources ne sont pas prises en charge par la génération PNG au moment de la construction

130

Plugin AndroidStudio 3.0 / Android Gradle 3.0

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

J'obtiens cette erreur:

les références à d'autres ressources ne sont pas prises en charge par la génération PNG au moment de la construction

Sera-t-il possible de le résoudre ou s'agit-il d'une solution obsolète?

langme
la source
Sujet associé - Mise à jour d'Android Studio vers 3.0 et obtention de ce problème . Bien que la solution soit exactement la même.
RBT

Réponses:

315

Pour prendre en charge le SDK API <24, ajoutez la ligne suivante à votre application build.gradle:

defaultConfig{
   vectorDrawables.useSupportLibrary = true
}

Si votre minSdkVersion est de 24 ou plus, votre problème sera résolu de lui-même, car VectorDrawables a une prise en charge complète à partir de cette API.

Voir Développeurs Android: Solution de compatibilité descendante Vector Drawables pour plus de détails.

mwa91
la source
4
Mais pourquoi le problème se pose-t-il et la solution ci-dessus est-elle un correctif rapide ou une bonne stratégie?
Pranaysharma
@Pranaysharma Voir Développeurs Android: Solution de compatibilité descendante Vector Drawables pour plus de détails.
PointedEars
1
Remarque: useSupportLibrary n'est pas la bonne solution pour moi (SDK min 16, cible 26), l'application plante au démarrage. J'ai dû supprimer cela, supprimer @color des vecteurs et simplement rechercher et remplacer tous les android: fillColor = pieces manuellement. C'est très rapide en fait, prend 10 secondes
djdance
Où ajouter cette ligne?
Roymunson
@Roymunson à l'intérieur de la clé Android. Regardez la réponse de Wonil dans ce fil lui-même.
RBT
14

vous devez utiliser le code hexadécimal directement sans faire référence à une ressource.

<vector
  <path
    android:fillColor="#FFF"/></vector>
Oussema Aroua
la source
1
c'est une version de régression ... si vous voulez changer de couleur, vous pouvez changer une à une ... il est plus facile de faire une référence dans le fichier couleur et de la changer.
langme
là, malheureusement, c'est le seul moyen de faire fonctionner votre application ou vous devez rétrograder votre version gradle
Oussema Aroua
3
Moi aussi j'ai le même problème. Pourquoi une fonctionnalité qui fonctionnait auparavant correctement serait-elle désactivée? Est-ce peut-être un bug?
joaomgcd
Je viens de mettre à jour AS3 et j'ai aussi ce problème. Pourquoi cette fonctionnalité serait-elle supprimée?
Marty
1
Cela fonctionne comme une solution de contournement, mais la «bonne» réponse est la réponse de @ mwa91 à ajouter vectorDrawables.useSupportLibrary = trueà votre build.gradle.
Sean Barbeau
9

Un peu plus de contexte pour cette erreur:

  • Android 5.0 (niveau d'API 21) a été la première version à prendre officiellement en charge les dessins vectoriels.
  • Si vous utilisez minSdkVersion inférieur à 20, il existe deux solutions pour le dessin vectoriel
    • Vector Asset Studio d'Android Studio génère du PNG. Veuillez consulter le document Android Studio . Cependant, les références à d'autres ressources ne sont pas prises en charge par la génération PNG au moment de la construction.
    • Utiliser la bibliothèque de support
  • Ou, utilisez 21 ou plus pour minSdkVersion

Pour la bibliothèque de support, ajoutez une instruction à votre fichier build.gradle:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
  compile 'com.android.support:appcompat-v7:23.2.0'
}
Wonil
la source
@MikeHanafey Pourriez-vous s'il vous plaît indiquer à doc pourquoi minSdkVersion doit être 24? Merci.
Gagné
Le message ci-dessous se produit à moins que minSdkVersion ne soit augmenté à 24. Je n'ai pas d'explication, et j'ai trouvé cela en incrémentant simplement la valeur jusqu'à ce que la construction de gradle réussisse. Erreur: java.lang.RuntimeException: java.lang.RuntimeException: Erreur lors du traitement ./src/main/res/drawable/ic_selection_right_widen.xml: Impossible de traiter l'attribut android: fillColor = "@ color / kb_key_long_press_available": références à d'autres les ressources ne sont pas prises en charge par la génération PNG au moment de la construction. Voir developer.android.com/tools/help/vector-asset-studio.html pour plus de détails.
Mike Hanafey
3
@MikeHanafey minSdkVersion ne doit être égal à 24 que si vous utilisez android: filltype, que parfois l'actif vectoriel Android met automatiquement. Débarrassez-vous-en.
Simone
1
@Simone Merci pour la suggestion. C'était le problème dans mon cas.
Abdul Rehman Yawar Khan
par défaut fillTypeest nonZeromais il ne diffère evenOdddans certains cas: w3.org/TR/SVG/painting.html#FillRuleProperty
HMAC
4

N'utilisez pas colorReference à l'attribut fillColor dans Vector drawable, utilisez simplement le code hexa

utiliser comme ça

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

au lieu de cela

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

Sai Gopi moi
la source
2
Ceci est un patch, je veux pouvoir re-thème mon application sans dupliquer tous les drawables, aussi c'est créer du png au lieu de garder le vecteur. Les gens devraient utiliser la solution de @ mwa91.
Kikiwa
0

J'ai pu contourner ce problème en procédant comme suit:

  1. créez un dossier drawable-v21 et copiez tous vos fichiers XML dessinables qui utilisent des variables ici
  2. dans le dossier dessinable d'origine, changez toutes les icônes pour utiliser une couleur statique

De cette façon, le compilateur fonctionnera

joaomgcd
la source
1
Oui, probablement parce que l'API 21 prend en charge Android 5.0 (Lollipop) qui prend en charge nativement les dessins vectoriels. Cependant, les appareils avec des versions antérieures pourraient alors ne pas avoir d'images appropriées du tout: developer.android.com/guide/topics/graphics
...
0

Je pense que vous utilisez android:fillColor="@color/image_button_disabled"ce code pour dessiner des vecteurs.

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

Ce n'est pas pris en charge.

Remplacez-le simplement par android:fillColor="#c4ca5e"

Ahamadullah Saikat
la source
0

Pour ajouter jusqu'à @ mwa91 answer .

Si vous avez besoin d'une thématisation dynamique de drawable, mais que vous n'avez pas le temps de mettre à jour vos mises en page et d'utiliser @ mwa91 answer et de changer tous les android:src="@drawable/..."attributs en app:srcCompat="@drawable/...", vous pouvez toujours utiliser la valeur de couleur hexadécimale dans drawable, puis teinter plus tard le drawable dans ImageView:

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