Diferencia entre app: srcCompat y android: src en el diseño XML de Android

138

Cada vez que creo un ImageView con un icono agregado usando los activos vectoriales de Android Studio, recibo un error en la línea app:srcCompat="@drawable/ic_play"

Cuando cambio el app:srcCompatcon android:src, el error desaparece pero el icono parece pixelado.

¿Cuál es la principal diferencia entre

app:srcCompat="@drawable/ic_play"

y

android:src="@drawable/ic_play"
Zayid Mohammed
fuente

Respuestas:

139

aplicación: srcCompat

es el método más infalible para integrar dibujos vectoriales en su aplicación. Los dibujos vectoriales le permiten reemplazar múltiples activos png con un solo gráfico vectorial, definido en XML. Si bien anteriormente se limitaba a Lollipop y dispositivos superiores

Nota

A partir de Android Support Library 23.3.0 , los dibujos de vectores de soporte solo se pueden cargar a través de app:srcCompat.

necesita agregar vectorDrawables.useSupportLibrary = true a su build.gradlearchivo

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

android: src

Establece un elemento dibujable como el contenido de este ImageView. Se mostrará en su tamaño original. Sin escala automática.

IntelliJ Amiya
fuente
2
el error con la aplicación: srcCompact desaparece cuando se agrega vectorDrawables.useSupportLibrary = true en el módulo de la aplicación Gradle
Zayid Mohammed
3
¿La aplicación: srcCompat entrará en conflicto con versiones anteriores de Android? Más específicamente, Api 19 es la versión más antigua a la que me refiero.
Equivoco el
Wow finalmente puede deshacerse de los iconos de mapa de bits.
Meow Cat 2012
El enlace de publicación de Google Plus ahora está muerto
Vadim Kotov
He agregado más arriba build.gradle, pero todavía no funciona, ¿alguna idea?
David Callanan
20

Si está utilizando android:src="@drawable/some_vector"sin el vectorDrawables.useSupportLibrary = truearchivo build.gradle y su aplicación tiene imágenes vectoriales (dibujables en vector), entonces, al compilar el archivo apk, el complemento de gradle de Android genera muchos archivos * .png para diferentes pantallas (hdpi, xhdpi ...) cada uno de sus vectores dibujables (solo para API = <19). El resultado: mayor tamaño de apk .

Cuando se usa app:srcCompat="@drawable/some_vector"con vectorDrawables.useSupportLibrary = trueAndroid, se usan archivos dibujables vectoriales sin generar *.pngarchivos.

Puede verificar esto con la herramienta de análisis de Android Studio apk. Solo construye apk con y sin vectorDrawables.useSupportLibrary = true.

Creo que esta es la principal diferencia.

bitvale
fuente
Entonces, si tiene useSupportLibrary establecido en verdadero, ¿por qué necesita la sintaxis especial, en lugar de android: src =? Si usa android: src = con useSupportLibrary activado, ¿evita la proliferación de PNG?
Oscar
9

Utilizar:

app:srcCompat="@drawable/backImage"

El atributo srcCompat se define realmente dentro de la biblioteca AppCompat. Importante: necesitará agregar el espacio de nombres apropiado para esto.

xmlns:app="http://schemas.android.com/apk/res-auto"

Nota

Lo que está recibiendo parece ser solo un error de pelusa que puede ignorarse. He intentado y obtuve el mismo error, pero funciona correctamente.

Puede usar tools:ignore="MissingPrefix"para evitar ver este error, temporalmente.

Espero que esto ayude.

Chandrahasan
fuente
5

Al usar AppCompatcon ImageView(o subclases como ImageButtony FloatingActionButton), podrá usar el nuevo app:srcCompatatributo para hacer referencia a dibujos vectoriales en versiones anteriores de la plataforma (así como cualquier otro elemento disponible para dibujar android:src) .

android.support.v7.appcompat.R.attr.srcCompat :

srcCompat

Establece un dibujable como el contenido de este ImageView. Permite el uso de vectores dibujables cuando se ejecuta en versiones anteriores de la plataforma.

Puede ser una referencia a otro recurso, en el formulario "@[+][package:]type/name"o un atributo de tema en el formulario "?[package:]type/name".


No olvides agregarlo xmlns:app="http://schemas.android.com/apk/res-auto"cuando lo uses app:srcCompat.

Mir-Ismaili
fuente
4

Los vectores y los vectores animados solo se admiten en versiones recientes del marco. srcCompat se puede usar con la biblioteca de compatibilidad para que funcionen, pero esto solo funciona con ciertas vistas en la biblioteca de soporte. Tenga en cuenta que la aplicación: se utiliza en lugar de android :. Esto significa que no es parte del marco, sino un parámetro definido por su aplicación.

Gabe Sechan
fuente
3
app:srcCompat="some_resource" 

es referir que es AppCompatActivity src que viene en la biblioteca de soporte mientras

android:src="some_resource"

se refiere a actividad simple.

Idrees de Najeeb
fuente
3

Cuando se usa AppCompatcon ImageView(o subclases como ImageButtony FloatingActionButton), podrá usar el nuevo app:srcCompatatributo para hacer referencia a dibujos vectoriales (así como a cualquier otro elemento disponible para dibujar android:src). Y si está cambiando los elementos dibujables en tiempo de ejecución, podrá utilizar el mismo setImageResource()método que antes (no hay cambios allí).

Utilizando AppCompat y app:srcCompates el método más infalible para integrar dibujos vectoriales en su aplicación. Encontrará que hacer referencia directa a los dibujos vectoriales fuera de app:srcCompatfallará antes de Lollipop .

Muhammad Younas
fuente
1

Android 5.0 (API nivel 21) y superior proporciona soporte de dibujo vectorial, por lo que para admitir dibujos vectoriales en la aplicación de versiones anteriores: se agregó srcCompat

SaravInfern
fuente