Verweise auf andere Ressourcen werden von der PNG-Generierung zur Build-Zeit nicht unterstützt

129

AndroidStudio 3.0 / Android Gradle Plugin 3.0

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

Ich erhalte diesen Fehler:

Verweise auf andere Ressourcen werden von der PNG-Generierung zur Build-Zeit nicht unterstützt

Wird es möglich sein, das Problem zu beheben, oder handelt es sich um eine veraltete Lösung?

langme
quelle
Verwandter Thread - Android Studio wurde auf 3.0 aktualisiert und dieses Problem wird behoben . Obwohl die Lösung genau gleich ist.
RBT

Antworten:

314

Fügen Sie Ihrer App die folgende Zeile hinzu, um API SDK <24 zu unterstützen build.gradle:

defaultConfig{
   vectorDrawables.useSupportLibrary = true
}

Wenn Ihre minSdkVersion 24 oder höher ist, wird Ihr Problem von selbst behoben, da VectorDrawables ab dieser API die volle Unterstützung bietet.

Weitere Informationen finden Sie unter Abwärtskompatibilitätslösung für Android-Entwickler: Vector Drawables .

mwa91
quelle
4
Aber warum taucht das Problem auf und ist die oben genannte Lösung ein Quickfix oder eine gute Strategie?
Pranaysharma
@Pranaysharma Weitere Informationen finden Sie unter Android-Entwickler: Vector Drawables-Abwärtskompatibilitätslösung .
PointedEars
1
Hinweis: useSupportLibrary ist für mich eine falsche Lösung (min. SDK 16, Ziel 26). Die App stürzt beim Start ab. Ich musste dies entfernen, @color aus Vektoren entfernen und einfach alle android: fillColor = Teile manuell suchen und ersetzen. Es ist eigentlich sehr schnell, nehmen Sie 10 Sekunden
DJDance
Wo füge ich diese Zeile hinzu?
Roymunson
@ Roymunson in Android Key. Schauen Sie sich Wonils Antwort in diesem Thread an.
RBT
14

Sie müssen den Hex-Code direkt verwenden, der sich nicht auf eine Ressource bezieht.

<vector
  <path
    android:fillColor="#FFF"/></vector>
Oussema Aroua
quelle
1
Es ist eine Regressionsversion. Wenn Sie die Farbe ändern möchten, können Sie sie nacheinander ändern. Es ist einfacher, eine Referenz in der Farbdatei zu erstellen und diese zu ändern.
Langme
Dort ist dies leider die einzige Möglichkeit, Ihre App zum Laufen zu bringen, oder Sie müssen Ihre Gradle-Version herabstufen
Oussema Aroua
3
Ich habe auch das gleiche Problem. Warum sollte eine Funktion, die zuvor einwandfrei funktionierte, deaktiviert werden? Ist das vielleicht ein Fehler?
Joaomgcd
Ich habe gerade auf AS3 aktualisiert und auch dieses Problem erhalten. Warum sollte diese Funktion entfernt werden?
Marty
1
Dies funktioniert als Problemumgehung, aber die "richtige" Antwort ist die Antwort von @ mwa91, die Sie vectorDrawables.useSupportLibrary = truezu Ihrer hinzufügen können build.gradle.
Sean Barbeau
9

Etwas mehr Kontext für diesen Fehler:

  • Android 5.0 (API Level 21) war die erste Version, die offiziell Vektor-Drawables unterstützte.
  • Wenn Sie minSdkVersion unter 20 verwenden, gibt es zwei Lösungen für das Zeichnen von Vektoren
    • Das Vector Asset Studio von Android Studio generiert PNG. Bitte schauen Sie sich das Android Studio-Dokument an . Verweise auf andere Ressourcen werden jedoch von der PNG-Generierung während der Erstellung nicht unterstützt.
    • Verwenden Sie die Support-Bibliothek
  • Oder verwenden Sie 21 oder höher für minSdkVersion

Fügen Sie für die Support-Bibliothek eine Anweisung zu Ihrer build.gradle-Datei hinzu:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
  compile 'com.android.support:appcompat-v7:23.2.0'
}
Wonil
quelle
@MikeHanafey Könnten Sie bitte darauf hinweisen, warum minSdkVersion 24 sein muss? Vielen Dank.
Wonil
Die folgende Meldung wird angezeigt, es sei denn, minSdkVersion wird auf 24 erhöht. Ich habe keine Erklärung und habe dies durch einfaches Inkrementieren des Werts festgestellt, bis der Gradle-Build erfolgreich war. Fehler: java.lang.RuntimeException: java.lang.RuntimeException: Fehler bei der Verarbeitung ./src/main/res/drawable/ic_selection_right_widen.xml: Attribut android: fillColor = "@ color / kb_key_long_press_available" kann nicht verarbeitet werden: Verweise auf andere Ressourcen werden von der PNG-Generierung zur Build-Zeit nicht unterstützt. Weitere Informationen finden Sie unter developer.android.com/tools/help/vector-asset-studio.html .
Mike Hanafey
3
@MikeHanafey minSdkVersion muss nur 24 sein, wenn Sie android: filltype verwenden, das manchmal vom Android Vector Asset automatisch eingefügt wird. Entfernen Sie es einfach.
Simone
1
@ Simone Danke für den Vorschlag. Das war das Problem in meinem Fall.
Abdul Rehman Yawar Khan
Die Standardeinstellung fillTypeist nonZero, unterscheidet sich jedoch nur evenOddin bestimmten Fällen von: w3.org/TR/SVG/painting.html#FillRuleProperty
hmac
4

Verwenden Sie colorReference nicht beim fillColor-Attribut in Vector drawable, sondern verwenden Sie nur Hexa-Code

benutze so

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

an Stelle von

<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 N.
quelle
2
Dies ist ein Patch. Ich möchte meine App neu gestalten können, ohne alle Drawables zu duplizieren. Außerdem wird PNG erstellt, anstatt vektoriell zu bleiben. Leute sollten die Lösung von @ mwa91 verwenden.
Kikiwa
0

Ich konnte dies umgehen, indem ich Folgendes tat:

  1. Erstellen Sie einen drawable-v21-Ordner und kopieren Sie alle Ihre drawable xmls, die dort Variablen verwenden
  2. Ändern Sie im ursprünglichen Zeichenordner alle Symbole, um eine statische Farbe zu verwenden

Auf diese Weise funktioniert der Compiler

joaomgcd
quelle
1
Ja, wahrscheinlich, weil API 21 Android 5.0 (Lollipop) unterstützt, das Vektor-Drawables nativ unterstützt. Geräte mit früheren Versionen haben dann möglicherweise überhaupt keine richtigen Bilder: developer.android.com/guide/topics/graphics/…
PointedEars
0

Ich denke, Sie verwenden android:fillColor="@color/image_button_disabled"diesen Code für Vektor zeichnbar.

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

Es wird nicht unterstützt.

Ersetzen Sie es einfach durch android:fillColor="#c4ca5e"

Ahamadullah Saikat
quelle
0

Um @ mwa91 Antwort zu addieren .

Wenn Sie ein dynamisches Theming für Drawable benötigen, aber keine Zeit haben, Ihre Layouts zu aktualisieren und mit @ mwa91 zu antworten und alle android:src="@drawable/..."Attribute in zu ändern app:srcCompat="@drawable/...", können Sie in Drawable immer den Hex-Farbwert verwenden und das Drawable später in ImageView tönen:

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