在Lollipop API 21设备中,收到"Getting app:drawableEndCompat instead of android:drawableEnd"的警告

11

AS 4.0.1

API 21及以上会发出“请使用app:drawableEndCompat而不是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的“文件 | 新建 | 矢量资产 | 配置矢量资产”创建的SVG(矢量可绘制图形)。
在我的Build.gradle文件中,我有以下配置:
minSdkVersion 21
targetSdkVersion 29
vectorDrawables.useSupportLibrary true

由于最小API为21,即Lollipop版本,我认为矢量图形应该是被默认支持的,我们可以直接使用DrawableEnd、DrawableStart等标签而无需使用compat版本?

我认为compat版本是用于早于21的API级别,也就是Kitkat及以下版本。因为我不会针对那些较低的版本,所以我不确定为什么我会收到警告。

如果不使用compat版本,则会导致在低于21的设备上出现问题。

非常感谢任何建议。

2个回答

19
这个警告的主要目的是通过向后兼容来使您的VectorDrawables在所有设备上看起来相同。使用"Compat",您将确保在API 21以下(Lollipop)的设备上使用矢量资源不会导致应用程序崩溃。简而言之,使用drawableEndCompat将允许任何人在旧版API(<21)上使用drawableEnd的相同功能。
现在您可能会想到应该选择什么: 如果您使用drawableEndCompat,它将在每个设备上按预期工作。据我所知,API大于21的设备将在内部将其解开为普通的drawableEnd。 如果您选择使用drawableEnd,它仅适用于API 21及以上的设备。
如果您认为我不需要任何兼容支持:您可以将应用程序的最小SDK从当前值增加至至少21。然后,您可以在没有任何警告的情况下安心使用关键字drawableEnd。 此外,您可以选择为不同的API创建不同的布局文件,在API 21以下的布局文件中使用drawableEndCompat,在API 21及以上的布局文件中使用drawableEnd。在我的意见中,您还可以检查是否可以在同一位置使用两个属性。我觉得它们也可以一起工作。

如果您不支持API 21以下的设备,那么就没有问题:您不应该遇到任何问题/警告。还有一件事我需要告诉您 - 即使您是正确的,Android Studio有时也会抛出警告或错误。在这种情况下,如果您觉得自己是正确的,您应该尝试在菜单栏中单击文件选项后选择无效/重启选项。我还建议长时间使用系统或始终将其保持睡眠模式的人尝试重新启动系统。

所以,对于TextView,您应该使用app:drawableEndCompat(或start、top、bottom)而不是app:drawableEnd


4

自API 21开始支持矢量图,但新功能会不断添加,即使是对矢量图也是如此。使用AppCompat并不用担心这个问题可能是个好主意。

在API 23中,添加了TextView上对复合图像进行着色的功能。该建议将您引向兼容版本,其中该功能进行了向后移植。

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

如果没有使用复合图像着色,则可以使用平台版本的属性而无需担心。

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

即使我在TextView中没有使用任何drawableTintdrawableTintMode,我仍会收到那个警告?我可以理解,如果我试图在低于23的设备上使用drawableTint,则可能会出现警告。 - ant2009
抱歉之前表述不够清晰,实际上主要意思是:你正在使用AppCompat,它会推荐你使用AppCompat属性,否则可能会出现意外的行为。就像colorPrimaryandroid:colorPrimary等类似情况。 - Eugen Pechanec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接