Odwołania do innych zasobów nie są obsługiwane przez generowanie plików PNG w czasie kompilacji

134

Wtyczka AndroidStudio 3.0 / Android Gradle 3.0

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

Otrzymuję ten błąd:

odniesienia do innych zasobów nie są obsługiwane przez generowanie plików PNG w czasie kompilacji

Czy będzie można go rozwiązać, czy jest to przestarzałe rozwiązanie?

langme
źródło
Powiązany wątek - Zaktualizowano Android Studio do wersji 3.0 i otrzymuję ten problem . Chociaż rozwiązanie jest dokładnie takie samo.
RBT

Odpowiedzi:

323

Aby obsługiwać API SDK <24, dodaj następujący wiersz do swojej aplikacji build.gradlewewnątrz androidbloku:

defaultConfig {
   vectorDrawables.useSupportLibrary = true
}

Jeśli Twoja minSdkVersion ma 24 lub nowszą wersję, problem zostanie rozwiązany samodzielnie, ponieważ VectorDrawables ma pełne wsparcie począwszy od tego interfejsu API.

Aby uzyskać szczegółowe informacje, zobacz Android Developers: Vector Drawables Backward Compatibility Solution .

mwa91
źródło
4
Ale dlaczego pojawia się problem i czy powyższe rozwiązanie jest szybką naprawą czy dobrą strategią?
Pranaysharma
@Pranaysharma Aby uzyskać szczegółowe informacje, zobacz temat Developers Android: Vector Drawables Backward Compatibility Solution .
PointedEars
1
uwaga: useSupportLibrary jest dla mnie złym rozwiązaniem (min. SDK 16, cel 26), aplikacja ulega awarii przy starcie. Musiałem to usunąć, usunąć @color z wektorów i po prostu wyszukać i zamienić wszystkie android: fillColor = pieces ręcznie. Właściwie jest bardzo szybki, zajmuje 10 sekund
djdance
Gdzie dodać tę linię?
Roymunson
@Roymunson wewnątrz klucza Androida. Spójrz na odpowiedź Wonila w tym wątku.
RBT
15

musisz użyć kodu szesnastkowego bezpośrednio, nie odnosząc się do zasobu.

<vector
  <path
    android:fillColor="#FFF"/></vector>
Oussema Aroua
źródło
1
to jest wersja regresji ... jeśli chcesz zmienić kolor, możesz zmieniać go jeden po drugim ... łatwiej jest zrobić odniesienie w pliku koloru i zmienić go.
langme
niestety jest to jedyny sposób, aby aplikacja działała lub musisz obniżyć wersję
gradle
3
Ja też mam ten sam problem. Dlaczego funkcja, która wcześniej działała poprawnie, miałaby zostać wyłączona? Czy to może błąd?
joaomgcd
Właśnie zaktualizowałem do AS3 i również ten problem. Dlaczego ta funkcja miałaby zostać usunięta?
Marty
1
Działa to jako obejście, ale „właściwą” odpowiedzią jest odpowiedź @ mwa91, którą należy dodać vectorDrawables.useSupportLibrary = truedo swojego build.gradle.
Sean Barbeau
10

Trochę więcej kontekstu dla tego błędu:

  • Android 5.0 (poziom API 21) był pierwszą wersją, która oficjalnie obsługiwała rysunki wektorowe.
  • Jeśli używasz minSdkVersion niższej niż 20, istnieją dwa rozwiązania dla grafiki wektorowej
    • Vector Asset Studio w Android Studio generuje PNG. Zapoznaj się z dokumentem Android Studio . Jednak odniesienia do innych zasobów nie są obsługiwane przez generowanie plików PNG w czasie kompilacji.
    • Użyj biblioteki pomocy
  • Lub użyj 21 lub więcej dla minSdkVersion

Aby uzyskać bibliotekę wsparcia, dodaj instrukcję do pliku build.gradle:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
  compile 'com.android.support:appcompat-v7:23.2.0'
}
Wonil
źródło
@MikeHanafey Czy mógłbyś wskazać dokument, dlaczego minSdkVersion musi mieć 24? Dzięki.
Wonil
Poniższy komunikat pojawia się, dopóki wartość minSdkVersion nie zostanie zwiększona do 24. Nie mam wyjaśnienia i znalazłem to po prostu zwiększając wartość do momentu pomyślnego zbudowania gradle. Błąd: java.lang.RuntimeException: java.lang.RuntimeException: Błąd podczas przetwarzania ./src/main/res/drawable/ic_selection_right_widen.xml: Nie można przetworzyć atrybutu android: fillColor = "@ color / kb_key_long_press_available": odniesienia do innych zasoby nie są obsługiwane przez generowanie plików PNG w czasie kompilacji. Szczegółowe informacje można znaleźć na stronie developer.android.com/tools/help/vector-asset-studio.html .
Mike Hanafey
3
@MikeHanafey minSdkVersion musi mieć 24 tylko jeśli używasz android: filltype, który czasami automatycznie wstawia Android Vector Asset. Po prostu się go pozbądź.
Simone
1
@Simone Dziękuję za sugestię. To był problem w moim przypadku.
Abdul Rehman Yawar Khan
domyślnie fillTypejest, nonZeroale różni się tylko evenOddw niektórych przypadkach: w3.org/TR/SVG/painting.html#FillRuleProperty
hmac
5

Nie używaj colorReference w atrybucie fillColor w Vector drawable, po prostu użyj kodu szesnastkowego

używać w ten sposób

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

zamiast tego

<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 Me
źródło
2
To jest poprawka, chcę mieć możliwość zmiany motywu mojej aplikacji bez powielania wszystkich elementów do rysowania, a także tworzy png zamiast zachowywać wektorowe. Ludzie powinni używać rozwiązania @ mwa91.
Kikiwa,
0

Udało mi się to obejść, wykonując następujące czynności:

  1. utwórz folder drawable-v21 i skopiuj wszystkie pliki XML do rysowania, które używają tam zmiennych
  2. w oryginalnym folderze do rysowania zmień wszystkie ikony na kolor statyczny

W ten sposób kompilator będzie działał

joaomgcd
źródło
1
Tak, prawdopodobnie dlatego, że API 21 obsługuje system Android 5.0 (Lollipop), który natywnie obsługuje rysunki wektorowe. Jednak urządzenia ze starszymi wersjami mogą wtedy nie mieć żadnych odpowiednich obrazów: developer.android.com/guide/topics/graphics/ ...
PointedEars
0

Myślę, że używasz android:fillColor="@color/image_button_disabled"tego kodu do rysowania wektorów.

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

To nie jest obsługiwane.

Po prostu zastąp go android:fillColor="#c4ca5e"

Ahamadullah Saikat
źródło
0

Aby dodać do @ mwa91 odpowiedź .

W przypadku, gdy potrzebujesz dynamicznego motywu do rysowania, ale nie masz czasu, aby zaktualizować swoje układy i przejść z odpowiedzią @ mwa91 i zmienić wszystkie atrybuty na , zawsze możesz użyć wartości koloru szesnastkowego w rysunkach, a później odcień rysunku do rysowania w 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"
      />
TheTechWolf
źródło