Las referencias a otros recursos no son compatibles con la generación PNG en tiempo de construcción

Respuestas:

315

Para admitir API SDK <24, agregue la siguiente línea a su aplicación build.gradle:

defaultConfig{
   vectorDrawables.useSupportLibrary = true
}

Si su minSdkVersion es 24 o superior, entonces su problema se resolverá por sí solo, porque VectorDrawables tiene soporte completo comenzando con esta API.

Consulte Desarrolladores de Android: solución de compatibilidad con versiones anteriores de Vector Drawables para obtener más información.

mwa91
fuente
44
Pero, ¿por qué surge el problema y la solución anterior es una solución rápida o una buena estrategia?
Pranaysharma
1
nota: useSupportLibrary es una solución incorrecta para mí (SDK mínimo 16, objetivo 26), la aplicación se bloquea al inicio. Tuve que eliminar esto, eliminar @color de los vectores y simplemente buscar y reemplazar todos los android: fillColor = pieces manualmente. En realidad es muy rápido, toma 10 segundos
djdance
¿Dónde agrego esta línea?
Roymunson
@Roymunson dentro de la clave de Android. Mira la respuesta de Wonil en este hilo.
RBT
14

debe usar el código hexadecimal directamente sin referirse a un recurso.

<vector
  <path
    android:fillColor="#FFF"/></vector>
Oussema Aroua
fuente
1
es una versión de regresión ... si desea cambiar de color, puede cambiar uno por uno ... es más fácil hacer una referencia en un archivo de color y cambiarlo.
langme
desafortunadamente, esta es la única forma de hacer que su aplicación funcione o tiene que degradar su versión
gradle
3
Yo también tengo el mismo problema. ¿Por qué se deshabilitaría una característica que anteriormente funcionaba bien? ¿Es esto quizás un error?
joaomgcd
Acabo de actualizar a AS3 y también obtuve este problema. ¿Por qué se eliminaría esa característica?
Marty
1
Esto funciona como una solución alternativa, pero la respuesta "correcta" es la respuesta de @ mwa91 para agregar vectorDrawables.useSupportLibrary = truea su build.gradle.
Sean Barbeau
9

Un poco más de contexto para este error:

  • Android 5.0 (API nivel 21) fue la primera versión que admitió oficialmente los dibujos vectoriales.
  • Si usa minSdkVersion inferior a 20, hay dos soluciones para el dibujo vectorial.
    • El Vector Asset Studio de Android Studio genera PNG. Por favor, eche un vistazo al documento de Android Studio . Pero las referencias a otros recursos no son compatibles con la generación de PNG en tiempo de construcción.
    • Usar biblioteca de soporte
  • O use 21 o superior para minSdkVersion

Para la biblioteca de soporte, agregue una declaración a su archivo build.gradle:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
  compile 'com.android.support:appcompat-v7:23.2.0'
}
Wonil
fuente
@MikeHanafey ¿Podrías señalar el documento por qué minSdkVersion debe ser 24? Gracias.
Wonil
El siguiente mensaje aparece a menos que minSdkVersion se aumente a 24. No tengo una explicación, y encontré esto simplemente incrementando el valor hasta que la construcción de gradle tuvo éxito. Error: java.lang.RuntimeException: java.lang.RuntimeException: Error al procesar ./src/main/res/drawable/ic_selection_right_widen.xml: No se puede procesar el atributo android: fillColor = "@ color / kb_key_long_press_available": referencias a otros los recursos no son compatibles con la generación de PNG en tiempo de construcción. Consulte developer.android.com/tools/help/vector-asset-studio.html para más detalles.
Mike Hanafey
3
@MikeHanafey minSdkVersion debe ser 24 solo si usa android: filltype, que a veces el activo vectorial de Android se coloca automáticamente. Simplemente deshágase de él.
Simone
1
@Simone Gracias por la sugerencia. Ese fue el problema en mi caso.
Abdul Rehman Yawar Khan
el valor predeterminado fillTypees nonZeropero solo difiere evenOdden algunos casos: w3.org/TR/SVG/painting.html#FillRuleProperty
hmac
4

No use colorReference en el atributo fillColor en Vector dibujable solo use código hexa

usar así

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

en lugar de esto

<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
fuente
2
Este es un parche, quiero poder cambiar el tema de mi aplicación sin duplicar todos los elementos dibujables, también está creando png en lugar de mantener vectores. La gente debería usar la solución de @ mwa91.
Kikiwa
0

He podido solucionar esto haciendo lo siguiente:

  1. cree una carpeta drawable-v21 y copie todos sus xmls dibujables que usen variables allí
  2. en la carpeta dibujable original, cambie todos los iconos para usar un color estático

De esta manera el compilador funcionará

joaomgcd
fuente
1
Sí, probablemente porque API 21 es compatible con Android 5.0 (Lollipop) que es compatible con dibujos vectoriales dibujables de forma nativa. Sin embargo, los dispositivos con versiones anteriores podrían no tener imágenes adecuadas en absoluto: developer.android.com/guide/topics/graphics/…
PointedEars
0

Creo que está utilizando android:fillColor="@color/image_button_disabled"este código para dibujar vectores.

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

No es compatible.

Solo reemplácelo con android:fillColor="#c4ca5e"

Ahamadullah Saikat
fuente
0

Para sumar a @ mwa91 respuesta .

En caso de que necesite una temática dinámica de dibujable, pero no tiene tiempo para actualizar sus diseños e ir con la respuesta @ mwa91 y cambiar todos los atributos , siempre puede usar el valor de color hexadecimal en dibujable y luego teñir el dibujable en 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
fuente