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

Getting app:drawableEndCompat instead of android:drawableEnd warning for Lollipop API 21 devices

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 等?

我认为兼容版本适用于 21 API 之前的级别。奇巧及以下。由于我没有针对最低限度,我不确定为什么会收到该警告。

如果不使用兼容版本,这将导致那些小于 21 的设备出现现金。

非常感谢您的任何建议。

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

TextView 上添加 复合绘图 着色 in API 23。该建议将您推向 compat 变体,该变体向后移植了该功能。

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

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

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

此警告背后的主要动机是让您的 VectorDrawable 向后兼容,从而使它们在所有设备上看起来都一样。 通过使用“Compat”,您将确保使用您的矢量资产不会使您的应用程序在 API 21(Lollipop) 以下的设备上崩溃。简而言之,使用 drawableEndCompat 将允许任何人在较旧的 APIs(<21) 上使用 drawableEnd 的相同功能。 现在你会想我应该选择什么: 如果您使用的是 drawableEndCompat,它将在每台设备上如您所愿地工作。据我所知,API 超过 21 的设备将在内部像正常 drawableEnd 一样解包它们。 如果您选择使用 drawableEnd,它将仅适用于 API 21 岁及以上。

如果您认为我不需要任何 Compat 支持:您可以将应用程序的最小 SDK 从当前值增加到至少 21。然后您可以在没有任何警告的情况下和平地使用关键字 drawableEnd。 此外,您可以选择为不同的 API 创建不同的布局文件,在 API 21 以下的布局文件中,使用 drawableEndCompat,API 21 及以上的布局文件使用 drawableEnd。在我看来,您还可以检查是否可以在同一个地方使用这两个属性。我觉得他们也可以一起工作。

如果你不支持API21以下的设备,没有问题:你应该没有issues/warning。另外,我还需要告诉您一件事 - Android Studio 有时会抛出警告或错误;即使你是对的。在那种情况下,如果您觉得自己是正确的,您应该在单击菜单栏中的文件选项后尝试 invalidate/restart 选项。我还建议尝试为长时间使用系统或始终保持睡眠模式的每个人重新启动系统。

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