android android-support-library androiddesignsupport android-vectordrawable

android - Biblioteca de soporte VectorDrawable Resources $ NotFoundException



android-support-library androiddesignsupport (13)

Estoy usando Design Support Library versión 23.4.0 . He habilitado la bandera de gradle:

defaultConfig { vectorDrawables.useSupportLibrary = true }

Estoy usando la versión 23.0.2 de herramientas de compilación , pero aún así, Resources$NotFoundException en KitKat o Resources$NotFoundException .

imageView.setImageResource(R.drawable.drawable_image) cuando uso android:drawableLeft imageView.setImageResource(R.drawable.drawable_image) o imageView.setImageResource(R.drawable.drawable_image) .

Y sí, pongo esto en cada actividad en la que estoy usando elementos dibujables

static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }

¿Es esto un error de la biblioteca de soporte?


En mi caso particular, tuve este problema porque estaba usando un selector dibujable como recurso de imagen con varios vectores en el selector, como en:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@drawable/vector_select_blue"/> <item android:state_pressed="true" android:drawable="@drawable/vector_select_black"/> . . etc </selector>

Sí, bastante mal, pero no sabía mejor en ese momento.

Entonces, la forma correcta de hacerlo es usar la propiedad tint en su archivo vectorial, como en:

<vector ..vector properties.. android:tint="@color/vector_color_selector"> <path ..path properties../> </vector>

(También puede usar el atributo app: tint en AppCompatImageView)

Y ahora, su archivo vector_color_selector debe tener los colores que desea, como en:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@color/blue"/> <item android:state_pressed="true" android:color="@color/black"/> . . etc </selector>

Espero que esto ayude a alguien si las respuestas anteriores no funcionaron para usted. Expresando lo obvio, pero debo decir que aún necesita establecer vectorDrawables.useSupportLibrary = true en gradle, use AppCompatImageView y use app: srcCompat o setImageDrawable + AppCompatResources.getDrawable para evitar cualquier problema con la biblioteca de compatibilidad de vectores.


Intenta usar:

imageView.setImageDrawable(VectorDrawableCompat.create(getResources(), drawableRes, null));

No tiene que agregar AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); de esta manera.

Simplemente infle sus dibujos vectoriales con VectorDrawableCompat y ya está todo listo.


Lo sentimos por llegar tarde a la fiesta, pero esta respuesta puede ayudar a los usuarios que desean habilitar el indicador AppCompatDelegate.setCompatVectorFromResourcesEnabled (verdadero); para todas las actividades

1. Cree una clase que se extienda a la Aplicación (android.app.Application)

public class MyApplicationClass extends Application { @Override public void onCreate() { super.onCreate(); } }

2. Dirígete a Manifest.xml y agrega la siguiente línea a tu etiqueta

<application android:name=".MyApplicationClass" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> ... </application>

3. Agregue el siguiente código arriba en Crear en MyApplicationClass.java

// This flag should be set to true to enable VectorDrawable support for API < 21 static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }

Código completo para MyApplicationClass.java

import android.app.Application; import android.support.v7.app.AppCompatDelegate; /** * Created by Gaurav Lonkar on 23-Dec-17. */ public class MyApplicationClass extends Application { // This flag should be set to true to enable VectorDrawable support for API < 21 static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } @Override public void onCreate() { super.onCreate(); } }


Me tomó 3 cosas separadas para que esto funcione usando la biblioteca de soporte 23.4.0:

  1. Agregue esto a build.gradle

    defaultConfig { vectorDrawables.useSupportLibrary = true }

  2. Agregue lo siguiente a onCreate de su clase de aplicación

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

  3. Para todas las vistas xml en las que está configurando un reemplazo de dibujo vectorial

    android:src

    con

    app:srcCompat

    y en el código reemplaza esto:

    imageView.setImageResource(...);

    con

    imageView.setImageDrawable(...);


No coloque sus vectores en drawable-anydpi , los dispositivos antiguos no admiten eso

ponerlos en drawable


Para complementar algunas de las respuestas aquí: el soporte compatible con versiones anteriores de VectorDrawables tiene un precio y no funciona en todos los casos .

¿En qué casos funciona? He hecho este diagrama para ayudar (válido para la Biblioteca de soporte 23.4.0 a al menos 25.1.0).


Soporte para vectores dibujables en lugares como android:drawableLeft fue deshabilitado en la biblioteca de soporte 23.3. Fue anunciado en Google+ :

hemos decidido eliminar la funcionalidad que le permite usar elementos de dibujo vectoriales de los recursos en dispositivos anteriores a Lollipop debido a problemas encontrados en la implementación en la versión 23.2.0 / 23.2.1. Usando la aplicación: srcCompat y setImageResource () continúa funcionando.

Enlaces a problemas:

Sin embargo, si puede vivir con esos problemas, en 23.4 puede volver a habilitar esta funcionalidad usando AppCompatDelegate.setCompatVectorFromResourcesEnabled() .

Si tiene curiosidad por cómo funciona, la mejor persona para aprender es Chris Banes, autor de esta funcionalidad. Él explica en detalle en su blog .


Tuve un problema similar hace mucho tiempo, no funcionó configurando

vectorDrawables.useSupportLibrary = true

solo funcionó cuando creé la carpeta "mipmap", y el código utilizado

imageView.setImageResource (R.mipmap.drawable_image)

Tiene más información here


Tuvimos el mismo problema. Los dibujos vectoriales no eran visibles en Kitkat. AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); este problema agregando AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); al método de Actividades onCreate.

Antes de eso no olvides agregar:

defaultConfig { vectorDrawables.useSupportLibrary = true }

y llame a setImageResource para la vista que utiliza el vector dibujable. Mi punto de vista es ImageButton. Tengo las herramientas de compilación del SDK de Android versión 23.0.3


Use AppCompatImageView lugar de ImageView como lo dijo Harish Gyanani en los comentarios, funciona bien para mí.

Documentos oficiales


cambio

imageView.setImageResource(R.drawable.drawable_image)

a

imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.drawable_image));

si quieres usar vectordrawable en xml, usa esto:

app:srcCompat="@drawable/drawable_image"



Inflar Drawable''s

`VectorDrawable` `AnimatedVectorDrawable` en esta biblioteca de soporte se pueden inflar de esta manera:

  • Llamando getDrawable() estáticos getDrawable() :

//This will only inflate a drawable with <vector> as the root element VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector); //This will only inflate a drawable with <animated-vector> as the root element AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector); // This will inflate any drawable and will auto-fallback to the lollipop implementation on api 21+ devices ResourcesCompat.getDrawable(context, R.drawable.any_drawable);

Si se infla el código Drawable en java, se recomienda usar siempre ResourcesCompat.getDrawable() ya que esto maneja el respaldo de Lollipop cuando corresponda. Esto permite que el sistema almacene en caché Drawable ConstantState y, por lo tanto, es más eficiente.
La biblioteca tiene las siguientes animaciones morph (bidireccionales):

  • Animación de transformación de reproducción-pausa
  • Animación de transformación de Play-Stop
  • Animación de transformación de menú de Arrow-Hamburger

  • Como puede ver, produje la imagen de arriba en mi teléfono API 16 :

    import com.wnafee.vector.compat.AnimatedVectorDrawable; mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector);

    Mire el archivo README de github para vector-compat de vector-compat aquí: https://github.com/wnafee/vector-compat
    Esto solucionará su problema (hasta la API 14 ) si lo build.gradle dependencies build.gradle su módulo de build.gradle (generalmente al final del archivo):

    dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) //Trying to FIX Binary XML file line #2: invalid drawable tag animated-vector compile ''com.android.support:appcompat-v7:25.0.0'' compile ''com.android.support:design:25.0.0'' //not needed // compile ''com.android.support:support-vector-drawable:25.0.0'' compile ''com.wnafee:vector-compat:1.0.5''//*******holy grail *******https://github.com/wnafee/vector-compat // Failed to resolve: com.android.support:support-animated-vector-drawable:25.0.0 //not needed // compile ''com.android.support:support-animated-vector-drawable:25.0.0'' }


    defaultConfig { vectorDrawables.useSupportLibrary = true }

    use esto en app.gradle

    Luego use AppCompatDrawableManager para establecerDrawable y getDrawable. Funciona para mi