Différence entre app: srcCompat et android: src dans le format XML d'Android


138

Chaque fois que je crée un ImageView avec une icône ajoutée à l'aide des ressources vectorielles d'Android Studio, j'obtiens une erreur à la ligne app:srcCompat="@drawable/ic_play"

Lorsque je change le app:srcCompatavec android:src, l'erreur a disparu mais l'icône semble pixélisée.

Quelle est la principale différence entre

app:srcCompat="@drawable/ic_play"

et

android:src="@drawable/ic_play"

Réponses:


139

application: srcCompat

est la méthode la plus infaillible pour intégrer des éléments vectoriels dans votre application. Les éléments graphiques vectoriels vous permettent de remplacer plusieurs éléments png par un seul graphique vectoriel, défini en XML. Bien que précédemment limité à Lollipop et aux appareils supérieurs

Remarque

À partir de la bibliothèque de support Android 23.3.0 , les dessins vectoriels de support ne peuvent être chargés que via app:srcCompat.

vous devez ajouter vectorDrawables.useSupportLibrary = true à votre build.gradlefichier

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

Android: src

Définit un dessinable comme contenu de cette ImageView. Il s'affichera dans sa taille d'origine. Pas de mise à l'échelle automatique.


2
l'erreur avec l'application: srcCompact a disparu lors de l'ajout de vectorDrawables.useSupportLibrary = true dans le module d'application Gradle
Zayid Mohammed

3
L'application: srcCompat sera-t-elle en conflit avec les anciennes versions d'Android? Plus précisément, Api 19 est la version la plus ancienne à laquelle je fais référence.
Equivoque du

Wow peut enfin se débarrasser des icônes bitmap.
Meow Cat 2012

Le lien de publication Google Plus est maintenant mort
Vadim Kotov

J'ai ajouté ci-dessus build.gradle, mais cela ne fonctionne toujours pas, des idées?
David Callanan

20

Si vous utilisez android:src="@drawable/some_vector"sans vectorDrawables.useSupportLibrary = truedans le fichier build.gradle et votre application contient des images vectorielles (vecteur étirables), puis en construisant le APK fichier Android plug - in gradle génère beaucoup de fichiers * .png pour les écrans différents (hdpi, xhdpi ...) de chacun de vos vecteurs dessinables (uniquement pour API = <19). Le résultat - une plus grande taille d' apk .

Lors de l'utilisation app:srcCompat="@drawable/some_vector"avec vectorDrawables.useSupportLibrary = trueAndroid utilise des fichiers vectoriels dessinables sans générer de *.pngfichiers.

Vous pouvez vérifier cela avec l'outil d'analyse d'apk Android Studio. Construisez simplement apk avec et sans vectorDrawables.useSupportLibrary = true.

Je pense que c'est la principale différence.


Donc, si vous avez défini useSupportLibrary sur true, pourquoi avez-vous besoin de la syntaxe spéciale plutôt que de android: src =? Si vous utilisez android: src = avec useSupportLibrary activé, évitez-vous la prolifération des PNG?
Oscar

9

Utilisation:

app:srcCompat="@drawable/backImage"

L'attribut srcCompat est en fait défini dans la bibliothèque AppCompat. Important: vous devrez ajouter l'espace de noms approprié pour cela.

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

Remarque

Ce que vous obtenez semble être juste une erreur de peluche qui peut être ignorée. J'ai essayé et j'ai obtenu la même erreur, mais cela fonctionne correctement.

Vous pouvez utiliser tools:ignore="MissingPrefix"pour éviter de voir cette erreur, temporairement.

J'espère que ça aide.


5

Lorsque vous utilisez AppCompatavec ImageView(ou des sous-classes telles que ImageButtonet FloatingActionButton), vous pourrez utiliser le nouvel app:srcCompatattribut pour référencer des dessins vectoriels sur les anciennes versions de la plate-forme (ainsi que sur tout autre dessin disponible pour android:src) .

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

srcCompat

Définit un dessinable comme contenu de cette ImageView. Permet l'utilisation du vecteur dessiné lors de l'exécution sur les anciennes versions de la plate-forme.

Peut être une référence à une autre ressource, dans le formulaire "@[+][package:]type/name"ou un attribut de thème dans le formulaire "?[package:]type/name".


N'oubliez pas d'ajouter xmlns:app="http://schemas.android.com/apk/res-auto"lors de l'utilisation app:srcCompat.


4

Les vecteurs et les vecteurs animés n'étaient pris en charge que dans les versions récentes du framework. srcCompat peut être utilisé avec la bibliothèque de compatibilité pour les faire fonctionner, mais cela ne fonctionne qu'avec certaines vues de la bibliothèque de support. Notez que l'application: est utilisée à la place d'Android :. Cela signifie qu'il ne fait pas partie du framework, mais d'un paramètre défini par votre application.


3
app:srcCompat="some_resource" 

signifie que c'est AppCompatActivity src qui vient dans la bibliothèque de support tandis que

android:src="some_resource"

fait référence à une activité simple.


3

Lorsque vous utilisez AppCompatavec ImageView(ou des sous-classes telles que ImageButtonet FloatingActionButton), vous pourrez utiliser le nouvel app:srcCompatattribut pour référencer des éléments vectoriels dessinés (ainsi que tout autre dessinable disponible pour android:src). Et si vous changez les drawables au moment de l'exécution, vous pourrez utiliser la même setImageResource()méthode qu'avant (aucun changement ici).

L'utilisation de AppCompatet app:srcCompatest la méthode la plus infaillible pour intégrer des dessins vectoriels dans votre application. Vous constaterez que le référencement direct de dessinables vectoriels en dehors de app:srcCompatéchouera avant Lollipop .


1

Android 5.0 (niveau d'API 21) et supérieur fournit un support de dessin vectoriel afin de prendre en charge les dessinables vectoriels dans les anciennes versions de l'application: srcCompat a été ajouté

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.