Разница между app: srcCompat и android: src в XML-макете Android

138

Всякий раз, когда я создаю ImageView со значком, добавленным с помощью векторных ресурсов Android Studio, я получаю сообщение об ошибке в строке app:srcCompat="@drawable/ic_play"

Когда я меняю app:srcCompatс android:src, ошибка исчезает, но значок выглядит неровным.

В чем главное отличие

app:srcCompat="@drawable/ic_play"

и

android:src="@drawable/ic_play"
Зайид Мохаммед
источник

Ответы:

139

Приложение: srcCompat

- это наиболее надежный метод интеграции векторных чертежей в ваше приложение. Векторные чертежи позволяют заменять несколько ресурсов png одной векторной графикой, определенной в XML. Ранее ограничивался устройствами Lollipop и выше.

Заметка

Начиная с Android Support Library 23.3.0 , векторные чертежи поддержки можно загружать только через app:srcCompat.

вам нужно добавить vectorDrawables.useSupportLibrary = true в ваш build.gradleфайл

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

Android: ЦСИ

Устанавливает объект для рисования в качестве содержимого этого ImageView. Он будет отображаться в исходном размере. Нет автоматического масштабирования.

IntelliJ Amiya
источник
2
ошибка с приложением: srcCompact исчезла при добавлении vectorDrawables.useSupportLibrary = true в модуль приложения Gradle
Зайид Мохаммед,
3
Будет ли app: srcCompat конфликтовать со старыми версиями Android? В частности, Api 19 является самой старой версией, о которой я говорю.
Сомнительный
Вау наконец-то можно избавиться от растровых значков.
Meow Cat 2012
Ссылка на пост в Google Plus теперь мертва
Вадим Котов
Я добавил выше build.gradle, но он все еще не работает, есть идеи?
Дэвид
20

Если вы используете android:src="@drawable/some_vector"безvectorDrawables.useSupportLibrary = true файла build.gradle и ваше приложение имеет векторные изображения (векторные изображения), то при создании файла apk Android gradle плагин генерирует множество файлов * .png для разных экранов (hdpi, xhdpi ...) из каждый из ваших векторных изображений (только для API = <19). Результат - увеличенный размер apk .

При использовании app:srcCompat="@drawable/some_vector"с vectorDrawables.useSupportLibrary = trueAndroid используются векторные файлы с возможностью рисования без создания *.pngфайлов.

Вы можете проверить это с помощью инструмента анализатора apk Android Studio. Просто собери apk с и без vectorDrawables.useSupportLibrary = true.

Думаю, в этом главное отличие.

bitvale
источник
Итак, если для параметра useSupportLibrary установлено значение true, зачем вам нужен специальный синтаксис, а не android: src =? Если вы используете android: src = с активированным useSupportLibrary, избегаете ли вы распространения PNG?
Оскар
9

Использование:

app:srcCompat="@drawable/backImage"

Атрибут srcCompat фактически определен в библиотеке AppCompat. Важно: вам нужно будет добавить для этого соответствующее пространство имен.

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

Заметка

То, что вы получаете, кажется просто ошибкой lint, которую можно проигнорировать. Я попробовал и получил ту же ошибку, но она работает правильно.

Вы можете использовать, tools:ignore="MissingPrefix"чтобы временно не видеть эту ошибку.

Надеюсь, это поможет.

Chandrahasan
источник
5

При использовании AppCompatwith ImageView(или подклассов, таких как ImageButtonи FloatingActionButton), вы сможете использовать новый app:srcCompatатрибут для ссылки на векторные чертежи в более старых версиях платформы (а также на любые другие доступные для рисования android:src) .

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

srcCompat

Устанавливает рисование как содержимое этого ImageView. Позволяет использовать векторную графику при работе на более старых версиях платформы.

Может быть ссылкой на другой ресурс в форме "@[+][package:]type/name"или атрибутом темы в форме "?[package:]type/name".


Не забывайте добавлять xmlns:app="http://schemas.android.com/apk/res-auto"при использовании app:srcCompat.

Мир-исмаилиты
источник
4

Векторы и анимированные векторы поддерживались только в последних версиях фреймворка. srcCompat можно использовать с библиотекой совместимости, чтобы заставить их работать, но это работает только с определенными представлениями в библиотеке поддержки. Обратите внимание, что app: используется вместо android :. Это означает, что это не часть фреймворка, а параметр, определяемый вашим приложением.

Гейб Сечан
источник
3
app:srcCompat="some_resource" 

означает, что это AppCompatActivity src, который входит в библиотеку поддержки, а

android:src="some_resource"

относится к простой деятельности.

Наджиб Идрис
источник
3

При использовании AppCompatсImageView (или подклассов, таких как ImageButtonи FloatingActionButton), вы сможете использовать новый app:srcCompatатрибут для ссылки на векторные чертежи (а также на любые другие доступные для рисования объекты android:src). И если вы меняете чертежи во время выполнения, вы сможете использовать тот же setImageResource()метод, что и раньше (без изменений).

Использование AppCompatи app:srcCompatявляется наиболее надежным методом интеграции векторных чертежей в ваше приложение. Вы обнаружите, что прямая ссылка на векторные чертежи за пределами Lollipopapp:srcCompat завершится ошибкой. .

Мухаммед Юнас
источник
1

Android 5.0 (уровень API 21) и выше обеспечивает поддержку векторных изображений, поэтому для поддержки векторных чертежей в более старых версиях было добавлено приложение srcCompat

SaravInfern
источник