Unterschied zwischen app: srcCompat und android: src im Layout-XML von Android

138

Immer wenn ich eine ImageView mit einem Symbol erstelle, das mit den Vector Assets von Android Studio hinzugefügt wurde, wird in der Zeile eine Fehlermeldung angezeigt app:srcCompat="@drawable/ic_play"

Wenn ich das app:srcCompatmit ändere android:src, ist der Fehler verschwunden, aber das Symbol sieht pixelig aus.

Was ist der Hauptunterschied zwischen

app:srcCompat="@drawable/ic_play"

und

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

Antworten:

139

App: srcCompat

ist die kinderleichteste Methode zum Integrieren von Vektor-Drawables in Ihre App. Mit Vector-Drawables können Sie mehrere PNG-Assets durch eine einzige in XML definierte Vektorgrafik ersetzen. Bisher auf Lollipop und höhere Geräte beschränkt

Hinweis

Ab Android Support Library 23.3.0 können Support Vector Drawables nur über geladen werden app:srcCompat.

Sie müssen vectorDrawables.useSupportLibrary = true zu Ihrer build.gradleDatei hinzufügen

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

android: src

Legt ein Zeichen als Inhalt dieser ImageView fest. Es wird in seiner Originalgröße angezeigt. Keine automatische Skalierung.

IntelliJ Amiya
quelle
2
Der Fehler mit der App: srcCompact ist verschwunden, wenn vectorDrawables.useSupportLibrary = true im Gradle-App-Modul hinzugefügt wurde
Zayid Mohammed
3
Wird app: srcCompat mit älteren Android-Versionen in Konflikt stehen? Genauer gesagt ist Api 19 die älteste Version, auf die ich mich beziehe.
Zweideutig
Wow kann endlich Bitmap-Symbole loswerden.
Meow Cat 2012
Google Plus Post Link ist jetzt tot
Vadim Kotov
Ich habe oben hinzugefügt build.gradle, aber es funktioniert immer noch nicht, irgendwelche Ideen?
David Callanan
20

Wenn Sie verwenden , android:src="@drawable/some_vector"ohne vectorDrawables.useSupportLibrary = truein build.gradle Datei und Ihre App Vektor - Bilder (Vektor ziehbar), dann beim Aufbau der apk - Datei Android gradle Plugin erzeugt eine Menge * .png - Dateien für verschiedene Bildschirme (hdpi, xhdpi ...) aus Jeder Ihrer Vektoren kann gezeichnet werden (nur für API = <19). Das Ergebnis - größere Größe von apk .

Bei Verwendung app:srcCompat="@drawable/some_vector"mit vectorDrawables.useSupportLibrary = trueAndroid werden Vektor-Zeichendateien verwendet, ohne Dateien zu generieren *.png.

Sie können dies mit dem Android Studio apk analyzer tool überprüfen. Bauen Sie einfach apk mit und ohne vectorDrawables.useSupportLibrary = true.

Ich denke, das ist der Hauptunterschied.

Bitvale
quelle
Wenn Sie also useSupportLibrary auf true gesetzt haben, warum benötigen Sie die spezielle Syntax anstelle von android: src =? Wenn Sie android: src = mit aktivierter useSupportLibrary verwenden, vermeiden Sie die Verbreitung von PNGs?
Oscar
9

Verwenden:

app:srcCompat="@drawable/backImage"

Das srcCompat-Attribut wird tatsächlich in der AppCompat-Bibliothek definiert. Wichtig: Dazu müssen Sie den entsprechenden Namespace hinzufügen.

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

Hinweis

Was Sie bekommen, scheint nur ein Flusenfehler zu sein, der ignoriert werden kann. Ich habe versucht, den gleichen Fehler zu bekommen, aber es funktioniert richtig.

Sie können verwenden tools:ignore="MissingPrefix", um diesen Fehler vorübergehend zu vermeiden.

Ich hoffe das hilft.

Chandrahasan
quelle
5

Bei Verwendung AppCompatmit ImageView(oder Unterklassen wie ImageButtonund FloatingActionButton) können Sie das neue app:srcCompatAttribut verwenden, um auf Vektor-Drawables auf älteren Versionen der Plattform (sowie auf alle anderen verfügbaren Drawables android:src) zu verweisen .

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

srcCompat

Legt ein Drawable als Inhalt dieser ImageView fest. Ermöglicht die Verwendung von Vektoren, die auf älteren Versionen der Plattform gezeichnet werden können.

Kann ein Verweis auf eine andere Ressource im Formular "@[+][package:]type/name"oder ein Themenattribut im Formular sein "?[package:]type/name".


Vergessen Sie nicht, xmlns:app="http://schemas.android.com/apk/res-auto"bei der Verwendung hinzuzufügen app:srcCompat.

Mir-Ismaili
quelle
4

Vektoren und animierte Vektoren wurden nur in neueren Versionen des Frameworks unterstützt. srcCompat kann mit der Kompatibilitätsbibliothek verwendet werden, damit sie funktionieren. Dies funktioniert jedoch nur mit bestimmten Ansichten in der Unterstützungsbibliothek. Beachten Sie, dass App: anstelle von Android: verwendet wird. Dies bedeutet, dass es nicht Teil des Frameworks ist, sondern ein von Ihrer App definierter Parameter.

Gabe Sechan
quelle
3
app:srcCompat="some_resource" 

Es wird darauf hingewiesen, dass AppCompatActivity src in der Support-Bibliothek enthalten ist

android:src="some_resource"

bezieht sich auf einfache Aktivität.

Najeeb Idrees
quelle
3

Bei Verwendung AppCompatmit ImageView(oder Unterklassen wie ImageButtonund FloatingActionButton) können Sie das neue app:srcCompatAttribut verwenden, um auf Vektor-Drawables (sowie auf alle anderen verfügbaren Drawables android:src) zu verweisen . Und wenn Sie Drawables zur Laufzeit ändern, können Sie dieselbe setImageResource()Methode wie zuvor verwenden (keine Änderungen dort).

Die Verwendung von AppCompatund app:srcCompatist die kinderleichteste Methode zum Integrieren von Vektorzeichnungen in Ihre App. Sie werden feststellen, dass die direkte Referenzierung von Vektor-Drawables außerhalb von app:srcCompatvor Lollipop fehlschlägt .

Muhammad Younas
quelle
1

Android 5.0 (API Level 21) und höher bietet Unterstützung für Vektorzeichnungen. Um Vektorzeichnungen in älteren Versionen zu unterstützen, wurde folgende App hinzugefügt: srcCompat

SaravInfern
quelle