Estoy usando elementos de diseño vectoriales en Android antes de Lollipop y estas son algunas de mis bibliotecas y versiones de herramientas:
- Estudio de Android: 2.0
- Complemento de Android Gradle: 2.0.0
- Herramientas de compilación: 23.0.2
- Biblioteca de soporte de Android: 23.3.0
Agregué esta propiedad en mi nivel de aplicación Build.Gradle
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
También vale la pena mencionar que utilizo un dibujable adicional como LayerDrawable (layer_list) como se indica en el Blog oficial de Android ( enlace aquí ) para configurar elementos de diseño para elementos de diseño vectoriales fuera deapp:srcCompat
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/search"/>
</level-list>
Encontrará elementos de diseño vectoriales que hacen referencia directamente fuera de la aplicación: srcCompat fallará antes de Lollipop. Sin embargo, AppCompat admite la carga de elementos de diseño vectoriales cuando se hace referencia a ellos en otro contenedor dibujable, como StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable y RotateDrawable. Al usar esta indirección , puede usar elementos de diseño vectoriales en casos como el atributo android: drawableLeft de TextView, que normalmente no podría admitir elementos de diseño vectoriales.
Cuando estoy usando app:srcCompat
todo funciona bien, pero cuando uso:
android:background
android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom
en ImageView
, ImageButton
, TextView
o EditText
antes de la Piruleta, lanza una expection:
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9
fuente
Respuestas:
ÚLTIMA ACTUALIZACIÓN - Jun / 2019
La biblioteca de soporte ha cambiado un poco desde la respuesta original. Ahora, incluso el complemento de Android para Gradle puede generar automáticamente el PNG en el momento de la compilación. Entonces, a continuación hay dos enfoques nuevos que deberían funcionar en estos días. Puedes encontrar más información aquí:
Generación PNG
Gradle puede crear automáticamente imágenes PNG a partir de sus activos en el momento de la compilación. Sin embargo, en este enfoque, no se admiten todos los elementos xml . Esta solución es conveniente porque no necesita cambiar nada en su código o en su build.gradle. Solo asegúrese de estar utilizando el complemento de Android 1.5.0 o superior y Android Studio 2.2 o superior .
Estoy usando esta solución en mi aplicación y funciona bien. No se necesita una bandera build.gradle adicional . No es necesario ningún truco. Si va a / build / generate / res / pngs / ... puede ver todos los PNG generados.
Entonces, si tiene algún ícono simple (ya que no todos los elementos xml son compatibles), esta solución puede funcionar para usted. Simplemente actualice su Android Studio y su complemento de Android para Gradle.
Biblioteca de soporte
Probablemente, esta es la solución que funcionará para usted. Si vino aquí, significa que su Android Studio no está generando los PNG automáticamente. Entonces, tu aplicación falla.
O tal vez, no desea que Android Studio genere ningún PNG.
A diferencia de la "generación Auto-PNG" que admite un subconjunto de elementos XML, esta solución admite todas las etiquetas xml. Por lo tanto, tiene soporte completo para su diseño vectorial.
Primero debe actualizar su build.gradle para admitirlo :
Y luego, use en
app:srcCompat
lugar deandroid:src
mientras cargaVectorDrawables
. No olvide esto.Porque
TextView
, si está usando laandroidx
versión de la biblioteca de soporte, puede usarapp:drawableLeftCompat
(o derecha, arriba, abajo) en lugar deapp:drawableLeft
En caso de
CheckBox
/RadioButton
, use enapp:buttonCompat
lugar deandroid:button
.Si no está utilizando la
androidx
versión de la biblioteca de soporte y suminSdkVersion
es17
o superior o está utilizando un botón, puede intentar configurar mediante programación a través deACTUALIZACIÓN - Jul / 2016
Reactivaron ese VectorDrawable en la
biblioteca de soporte de Android 23.4.0
tal vez ,
build.gradle
configuración ahora esté obsoleta y solo necesite habilitarla en las actividades adecuadas (sin embargo, debe probarla).Ahora, para habilitarlo, debe hacer:
Respuesta original - Abril / 2016
Creo que esto está sucediendo porque Support Vector estaba deshabilitado en la última versión de la biblioteca: 23.3.0
Según este POST :
Si visita el problema ISSUE 205236 , parece que se habilitarán en el futuro, pero el problema de la memoria no se solucionará pronto:
Tuve un problema similar. Entonces, en mi caso, revirtí todos los íconos que usan dibujables vectoriales de recursos a imágenes PNG nuevamente (ya que el problema de memoria seguirá sucediendo incluso después de que brinden una opción para habilitarlo nuevamente).
No estoy seguro de si esta es la mejor opción, pero en mi opinión soluciona todos los fallos.
fuente
vectorDrawables.useSupportLibrary = true
propiedad para volver a habilitar la generación de png en el momento de la compilación nuevamente?Yo tuve el mismo problema. Pero haciendo mucho I + D obtuve la respuesta.
Para el uso de Imageview e ImageButton,
app:srcCompat="@drawable/...."
y para otras vistas como Button, Textview, en lugar de usar"drawableLeft/right..."
en el XML, especifique los elementos de diseño mediante programación como:Y use "AppCompatResources" para obtener el elemento de diseño.
fuente
Para desarrollar las otras muy buenas respuestas , aquí hay un diagrama que puede ayudarlo. Es válido si tiene una biblioteca de soporte desde 23.4.0 hasta al menos 25.1.0.
fuente
La respuesta de Guillherme P es bastante impresionante. Solo para hacer una pequeña mejora, no necesita agregar esa línea en cada actividad, si la agregó una vez en la clase Aplicación, también funcionará.
RECUERDE: aún debe haber habilitado el uso de la biblioteca de soporte en gradle:
Además, asegúrese de estar utilizando una versión de la biblioteca de soporte superior a la v23.4, cuando Google volvió a agregar el soporte para Drawable Containers para VectorDrawables ( nota de la versión )
Actualizar
Y para cambios de código:
app:srcCompat
todos los lugares que acepten elandroid:src
atributo (el IDE le advertirá si no es válido, como para la<bitmap>
etiqueta).Para
drawableLeft
,drawableStart
,drawableRight
,drawableEnd
atributos utilizados enTextView
y puntos de vista similares, se tendrán que establecer mediante programación por ahora. Un ejemplo de configuracióndrawableStart
:fuente
Yo tuve el mismo problema. Y arreglarlo quitando
Mi versión de destino es 25 y la biblioteca de soporte es
fuente
vectorDrawables.useSupportLibrary = true
VectorDrawables en pre-lollipop debería funcionar bien sin usar
Si desea usar VectorDrawables dentro de ImageViews, puede usar el atributo
srcCompat
y funcionará, pero dentro de Buttons o TextViews no lo hará , por lo que debe envolver el Drawable en un InsetDrawable o LayerDrawable. Hay otro truco que descubrí, si está utilizando el enlace de datos, puede hacer esto:Eso funcionará mágicamente, no he investigado lo que está sucediendo detrás de escena, pero supongo que TextView está usando el método getDrawable de AppCompatResources o similar.
fuente
Gran cantidad de I + D, finalmente obteniendo esta solución para fallas en dispositivos pre-piruleta.
Para Imageview
Para TextView / EditText
Para Build.gradle
fuente
Uso de la forma más fácil:
y ... solo utilícelo
app:**Compat
para compatibilidad. También agregue soporte enbuild.gradle
(módulo)fuente
Para cualquier persona que actualice a Android Gradle 3.0 y superior, no es necesario usarlo
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
o configurarlovectorDrawables.useSupportLibrary = true
(agregar esto causará problemas) y usarloapp:srcCompat
, simplemente funciona.Tómeme dos días para resolver esto, y no he encontrado ningún documento relacionado en los documentos de Google ...
fuente
Estoy usando VectorDrawables en dispositivos Pre-Lollipop y así es como lo hago: -
Paso 1: Pon esto en tu nivel de aplicación gradle.
Paso 2:
Pon esto en tu clase de Aplicación y no olvides registrar tu clase de Aplicación en el archivo de manifiesto.
Paso 3:
Obtenga VectorDrawables usando,
fuente
Después de usar el siguiente código.
Aún así, existe un problema de imágenes vectoriales porque los atributos siguientes son
DrawableEnd, DrawableStart, DrawableTop, DrawableBottom, Fondo
En este caso, siga lo siguiente, en lugar de hacer referencia a la imagen vectorial directamente, use la etiqueta de selector como un archivo de diseño intermedio.
Ejemplo:
ic_warranty_icon.xml
safe_ic_warranty_icon.xml
Su TextView / Layout.
fuente
selector
Probamos 3 cosas
Configuración de setCompatVectorFromResourcesEnabled en la clase de aplicación
Y use
app:srcCompat
Pero incluso después de eso, estaba fallando
luego descubrimos que nuestro SVG tenía una etiqueta de degradado. La conversión de la etiqueta de degradado en rutas individuales para la API inferior <= 23 y el uso de la misma API de SVG> = 24 funcionó.
Obtuve ayuda de esta respuesta https://stackoverflow.com/a/47783962/2171513
fuente
Simplemente superponga el vector dibujable a la lista de estados, luego el problema se resolverá
Por ejemplo, tiene una imagen vectorial de flecha hacia atrás:
sí, debe superponerlo a la lista de capas xml (ic_back_arrow_vector_vector.xml):
Porque la lógica:
y
no le ayudará en algunos dispositivos de China y dispositivos Samsung más antiguos. Si no los superpone, fallará.
fuente
Estuve luchando con esto durante horas.
Intenté todo lo que me dijeron estas respuestas, pero mi aplicación no dejó de fallar. Eliminé esta línea:
app:srcCompat="@drawable/keyboard"
y mi aplicación dejó de fallar. y luego, cuando agregué esto mismo, comenzó a fallar nuevamente. Así que decidí abrir ese archivo y vi un error en la primera línea que decíaHice clic derecho en el archivo y en "Mostrar en el explorador" y no estaba en la carpeta dibujable sino en el directorio drawable-v24. Así que lo copié y pegué en el directorio dibujable y finalmente me deshice de los bloqueos.
fuente
La sugerencia de Guilherme P no funcionó para mí. Seguí adelante y tomé la decisión de usar png donde necesito hacer cosas fuera de la aplicación: srcCompat, es decir, drawableLeft, drawableRight, etc. Este fue un cambio bastante fácil de hacer y no tiene los posibles problemas de memoria AppCompatDelegate.setCompatVectorFromResourcesEnabled ( cierto); introduce.
fuente
Una alternativa a la respuesta de Benny es crear una
Activity
superclase:Ahora extienda en
VectorDrawableActivity
lugar deAppCompatActivity
.fuente