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:
-
Agregue esto a build.gradle
defaultConfig { vectorDrawables.useSupportLibrary = true }
-
Agregue lo siguiente a onCreate de su clase de aplicación
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
-
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:
- https://code.google.com/p/android/issues/detail?id=205236
- https://code.google.com/p/android/issues/detail?id=204708
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í.
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"
`VectorDrawable`
`AnimatedVectorDrawable`
en esta biblioteca de soporte se pueden inflar de esta manera:
-
Llamando
getDrawable()
estáticosgetDrawable()
:
//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):
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