为Lollipop API 21设备获取app:drawableEndCompat而不是android:drawableEnd警告

问题描述

AS 4.0.1 

在API 21及更高版本上使用app:drawableEndCompat instead of android:drawableEnd警告

 <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是使用Android Studio File | New | Vector Asset | Configure Vector Assert创建的SVG(矢量可绘制)

在我的Build.gradle文件中,我具有以下配置:

minSdkVersion 21
targetSdkVersion 29
vectorDrawables.useSupportLibrary true

因为最小的是API 21(这是Lollipop),所以我一直在考虑是否支持矢量可绘制对象,我们可以使用不兼容版本的DrawableEnd,DrawableStart等吗?

我当时认为compat版本适用于21年前的API级别。 Kitkat及以下。而且由于我没有达到最低要求,所以我不确定为什么会收到该警告。

如果不使用兼容版本,则这些设备上的现金将少于21。

非常感谢您的任何建议。

解决方法

从API 21开始就支持矢量可绘制对象,但是随着时间的推移,甚至向矢量可绘制对象添加了新功能。使用AppCompat可能是个好主意,不必为此担心。

TextView上添加了

在复合可绘制对象 in API 23。建议将您推向compat变体,该功能已向后移植。

  • app:drawable*Compat
  • app:drawableTintapp:drawableTintMode

如果您不使用复合可绘制着色,则可以使用平台的属性版本。

  • android:drawable*
  • android:drawableTintandroid:drawableTintMode(已在API 23中添加)
,

此警告的主要目的是通过使VectorDrawables向后兼容,使它们在所有设备上看起来都一样。 通过使用“ Compat”,您将确保使用矢量资产不会使应用程序在API 21以下的设备上崩溃。简而言之,使用drawableEndCompat将允许任何人在较早的版本上使用与drawableEnd相同的功能蜜蜂。 现在您会想到我应该选择什么: 如果您使用的是drawableEndCompat,则它将在每个设备上都能正常工作。据我所知,API大于21的设备会在内部将它们像普通drawableEnd那样解开包装。 如果您选择使用drawableEnd,它将仅适用于API 21及更高版本。

如果您认为我不需要任何Compat支持:您可以将您的App最低SDK从当前值增加到至少21。然后您可以和平使用drawableEnd。 另外,您可以选择为不同的API创建不同的布局文件,在该布局文件中,对于低于API 21的布局文件,请使用drawableEndCompat;对于高于21 API的布局文件,请使用drawableEnd。我认为,您还可以检查是否可以在同一位置使用两个属性。我觉得他们也应该一起工作。

如果您不支持API 21以下的设备,则没有问题:您应该没有问题。另外,我还要告诉您一件事-Android Studio有时会发出警告或错误;即使你是对的。在这种情况下,请在菜单栏中单击“文件”选项,然后尝试使“无效/重新启动”选项生效。

对于TextView,您应该使用app:drawableEndCompat(或开始,顶部,底部)而不是app:drawableEnd