Получение приложения: drawableEndCompat вместо Android: предупреждение drawableEnd для устройств Lollipop API 21

#android #android-studio #android-vectordrawable

#Android #android-studio #android-векторное отображение

Вопрос:

КАК 4.0.1

Используйте app:drawableEndCompat instead of android:drawableEnd предупреждение для API 21 и выше

  <TextView
        android:id="@ id/tvCheckStock"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawableEnd="@drawable/ic_pin_drop
        android:gravity="center_vertical"/>
  

ic_pin_drop — это SVG (векторное изображение), созданное с использованием Android Studio File | New | Vector Asset | Configure Vector Assert

В моем Build.gradle файле у меня есть следующая конфигурация:

 minSdkVersion 21
targetSdkVersion 29
vectorDrawables.useSupportLibrary true
  

Поскольку min — это API 21, который является Lollipop, я подумал, что векторные чертежи поддерживаются из коробки, и мы можем использовать DrawableEnd, DrawableStart и т.д. Без совместимых версий?

Я думал, что совместимые версии были для уровня API до 21. Kitkat и ниже. И поскольку я не нацелен на этот минимум, я не уверен, почему я получаю это предупреждение.

Это приведет к тому, что на этих устройствах будет меньше 21, если не используется версия compat.

Большое спасибо за любые предложения.

Ответ №1:

Основной мотив этого предупреждения — сделать ваши VectorDrawables одинаковыми на всех устройствах, сделав их обратно совместимыми. Используя «Compat», вы гарантируете, что использование вашего векторного ресурса не приведет к сбою вашего приложения для устройств ниже API 21 (Lollipop). Короче говоря, использование drawableEndCompat позволило бы любому использовать те же функции drawableEnd в более старых API (<21). Теперь вы, вероятно, думаете, что мне следует выбрать: если вы используете drawableEndCompat , это будет работать так, как вы ожидаете, на каждом устройстве. Устройства с API более 21 будут внутренне разворачивать их как обычно drawableEnd , насколько я знаю. Если вы решите использовать drawableEnd , оно будет работать только для API 21 и выше.

Если вы считаете, что мне не нужна поддержка совместимости: вы можете увеличить минимальный пакет SDK вашего приложения с текущего значения по крайней мере до 21. Затем вы можете использовать ключевое слово drawableEnd мирно, без каких-либо предупреждений. Кроме того, вы можете создать другой файл макета для разных API, в соответствии с которым в файле макета для ниже API 21 используйте drawableEndCompat , а для API 21 и выше используйте drawableEnd . На мой взгляд, вы также можете проверить, можете ли вы использовать оба атрибута в одном месте. Я чувствую, что они также могут работать вместе.

Если вы не поддерживаете устройства ниже API 21, проблем нет: у вас не должно быть проблем / предупреждений. Кроме того, я должен сказать вам еще одну вещь — Android Studio иногда выдает предупреждения или ошибки; даже если вы правы. В этом случае, если вы считаете, что были правы, вам следует попробовать отменить / перезапустить опцию после нажатия опции File в строке меню. Я бы также посоветовал попробовать перезапустить вашу систему всем, кто использует system длительное время или всегда держит ее в спящем режиме.

Итак, для TextView вам следует использовать app:drawableEndCompat (или start, top, bottom) вместо app:drawableEnd

Ответ №2:

Векторные чертежи поддерживаются с API 21, но со временем добавляются новые функции, даже для векторных чертежей. Возможно, было бы неплохо использовать AppCompat и не беспокоиться об этом.

Подкрашивать смесь рисунки на TextView S был добавлен в API 23. Предложение подталкивает вас к варианту совместимости, в котором функция переносится обратно.

  • app:drawable*Compat
  • app:drawableTint и app:drawableTintMode

Если вы не используете составную тонировку для рисования, вас может устраивать версия атрибутов для платформы.

  • android:drawable*
  • android:drawableTint и android:drawableTintMode (добавлено в API 23)

Комментарии:

1. Хотя я не использую ни drawableTint или drawableTintMode в своем TextView. Я все равно получу это предупреждение? Я могу понять, что предупреждение могло появиться, если бы я пытался использовать drawableTint на устройстве, которому было меньше 23.

2. Извините за неясность, основная идея на самом деле такова: вы используете AppCompat, это подталкивает вас к атрибутам AppCompat, иначе вы можете получить неожиданное поведение. Аналогично colorPrimary vs android:colorPrimary и так далее.