Differenza tra app: srcCompat e android: src nel layout XML di Android


138

Ogni volta che creo un ImageView con l'icona aggiunta utilizzando le risorse vettoriali di Android Studio, visualizzo un errore in linea app:srcCompat="@drawable/ic_play"

Quando cambio il app:srcCompatcon android:src, l'errore scompare ma l'icona appare pixelata.

Qual è la differenza principale tra

app:srcCompat="@drawable/ic_play"

e

android:src="@drawable/ic_play"

Risposte:


139

app: srcCompat

è il metodo più sicuro per integrare i disegni vettoriali nella tua app. I disegni vettoriali ti consentono di sostituire più risorse png con un singolo elemento grafico vettoriale, definito in XML. Mentre precedentemente limitato a Lollipop e dispositivi superiori

Nota

A partire dalla libreria di supporto Android 23.3.0 , i disegni vettoriali di supporto possono essere caricati solo tramite app:srcCompat.

devi aggiungere vectorDrawables.useSupportLibrary = true al tuo build.gradlefile

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

Android: src

Imposta un disegno come contenuto di questo ImageView che verrà visualizzato nella sua dimensione originale. Nessun ridimensionamento automatico.


2
l'errore con l'app: srcCompact scompare quando viene aggiunto vectorDrawables.useSupportLibrary = true nel modulo dell'app Gradle
Zayid Mohammed,

3
L'app: srcCompat entrerà in conflitto con le versioni precedenti di Android? Più specificamente Api 19 è la versione più vecchia a cui mi riferisco.
Equivoco

Wow può finalmente sbarazzarsi delle icone bitmap.
Meow Cat 2012

Il link al post di Google Plus ora è morto
Vadim Kotov il

Ho aggiunto sopra build.gradle, ma non funziona ancora, qualche idea?
David Callanan,

20

Se stai usando android:src="@drawable/some_vector"senza vectorDrawables.useSupportLibrary = truenel file build.gradle e la tua app ha immagini vettoriali (disegno vettoriale), quindi durante la creazione del file apk il plug-in Android Gradle genera molti file * .png per schermi diversi (hdpi, xhdpi ...) da ognuno dei tuoi disegni vettoriali (solo per API = <19). Il risultato: dimensioni maggiori dell'apk .

Quando si utilizza app:srcCompat="@drawable/some_vector"con vectorDrawables.useSupportLibrary = trueAndroid utilizza file di disegno vettoriale senza generare *.pngfile.

Puoi verificarlo con lo strumento analizzatore di apk di Android Studio. Crea apk con e senza vectorDrawables.useSupportLibrary = true.

Penso che questa sia la differenza principale.


Quindi se hai useSupportLibrary impostato su true, perché hai bisogno della sintassi speciale, piuttosto che di android: src =? Se usi android: src = con useSupportLibrary attivato, eviti la proliferazione di PNG?
Oscar

9

Uso:

app:srcCompat="@drawable/backImage"

L'attributo srcCompat è attualmente definito nella libreria AppCompat. Importante: dovrai aggiungere lo spazio dei nomi appropriato per questo.

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

Nota

Quello che stai ottenendo sembra essere solo un piccolo errore che può essere ignorato. Ho provato e ottenuto lo stesso errore, ma funziona correttamente.

Puoi usarlo tools:ignore="MissingPrefix"per evitare di vedere questo errore, temporaneamente.

Spero che aiuti.


5

Quando si utilizza AppCompatcon ImageView(o sottoclassi come ImageButtone FloatingActionButton), sarà possibile utilizzare il nuovo app:srcCompatattributo per fare riferimento a disegni estraibili vettoriali su versioni precedenti della piattaforma (nonché a qualsiasi altro disegno disponibile disponibile android:src) .

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

srcCompat

Imposta un disegno come contenuto di questo ImageView. Consente l'uso del disegno vettoriale durante l'esecuzione su versioni precedenti della piattaforma.

Può essere un riferimento a un'altra risorsa, nel modulo "@[+][package:]type/name"o un attributo del tema nel modulo "?[package:]type/name".


Non dimenticare di aggiungere xmlns:app="http://schemas.android.com/apk/res-auto"quando si usa app:srcCompat.


4

Vettori e vettori animati sono stati supportati solo nelle versioni recenti del framework. srcCompat può essere utilizzato con la libreria di compatibilità per farli funzionare, ma funziona solo con determinate viste nella libreria di supporto. Si noti che l'app: viene utilizzata al posto di Android :. Ciò significa che non fa parte del framework, ma un parametro definito dalla tua app.


3
app:srcCompat="some_resource" 

si riferisce che è AppCompatActivity src che viene fornito nella libreria di supporto mentre

android:src="some_resource"

si riferisce alla semplice attività.


3

Quando si utilizza AppCompatcon ImageView(o sottoclassi come ImageButtone FloatingActionButton), sarà possibile utilizzare il nuovo app:srcCompatattributo per fare riferimento a drawable vettoriali (nonché a qualsiasi altro drawable disponibile per android:src). E se stai cambiando drawable in fase di esecuzione, sarai in grado di utilizzare lo stessosetImageResource() metodo di prima (nessuna modifica lì).

L'uso di AppCompated app:srcCompatè il metodo più sicuro per integrare i disegni vettoriali nella tua app. Scoprirai che fare riferimento direttamente a disegni estraibili vettoriali all'esterno di app:srcCompatfallirà prima di Lollipop .


1

Android 5.0 (livello API 21) e versioni successive forniscono supporto per i disegni vettoriali in modo da supportare i disegni a disegno vettoriali nelle app di versioni precedenti: è stato aggiunto srcCompat

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.