¿Cómo usar correctamente el Vector Drawable retrocompatible con la última Biblioteca de Soporte de Android?

Vector drawable ha sido agregado a Support Library no hace tanto tiempo y hubo muchos cambios en la API desde entonces: banderas de Gradle, bloques de inicializadores, selectores, atributos XML personalizados, etc. La pregunta es cómo usarla correctamente ahora ( support lib v25) en estos casos:

  • ImageView
  • TextView dibujable
  • Icono de menú
  • Ícono de notificación

XML y programáticamente.

Agregue la última lib de soporte a las dependencias build.gradle su aplicación:

 compile 'com.android.support:appcompat-v7:26.0.2' 

y agrega la siguiente línea en el mismo archivo:

 android { ... defaultConfig { ... vectorDrawables.useSupportLibrary = true } ... } 

Importar imagen vectorial a través de Vector Asset Studio .

Eso es todo, ¡estás listo para irte!


ImageView

XML

Utilice la app:srcCompat atributo app:srcCompat lugar de android:src :

  

Programáticamente

Directamente desde el ID del recurso:

 imageView.setImageResource(R.drawable.your_drawable); 

Establecer como objeto Drawable (por ejemplo, para teñir):

 Drawable vectorDrawable = AppCompatResources.getDrawable(context, R.drawable.your_vector); imageView.setImageDrawable(vectorDrawable); 

Y si quieres configurar el tinte:

 DrawableCompat.setTint (vectorDrawable, ContextCompat.getColor(context, R.color.your_color)); 

TextView dibujable

XML

No hay una solución simple: atributo XML android:drawableTop(Bottom etc) no puede manejar imágenes vectoriales en pre-Lollipop. Una solución es agregar bloque de inicializador a la actividad y ajustar vector en otro XML dibujable . Segundo: definir una vista de texto personalizada .

Programáticamente

Establecer el recurso directamente no funciona, debe usar el objeto Drawable . Obténgalo de la misma manera que para ImageView y ImageView con el método apropiado:

 textView.setCompoundDrawablesWithIntrinsicBounds(vectorDrawable, null, null, null); 

Icono de menú

No hay nada especial

  menuItem.setIcon(R.drawable.your_vector); 

Notificaciones:

Es imposible , tienes que usar PNGs 🙁

Necesita agregar vectorDrawables.useSupportLibrary = true a su archivo build.gradle:

 // Gradle Plugin 2.0+ android { defaultConfig { vectorDrawables.useSupportLibrary = true } } 

Notará que este nuevo atributo solo existe en la versión 2.0 del Plugin de Gradle. Si está utilizando Gradle 1.5, en su lugar utilizará:

 // Gradle Plugin 1.5 android { defaultConfig { generatedDensities = [] } // This is handled for you by the 2.0+ Gradle Plugin aaptOptions { additionalParameters "--no-version-vectors" } } 

Debe agregar srcCompat a su ImageView: