Android 布局 XML 中 app:srcCompat 和 android:src 的区别

Posted

技术标签:

【中文标题】Android 布局 XML 中 app:srcCompat 和 android:src 的区别【英文标题】:Difference between app:srcCompat and android:src in Android's layout XML 【发布时间】:2017-03-30 04:53:53 【问题描述】:

每当我使用 android Studio 的矢量资产创建带有添加图标的 ImageView 时,我都会在 app:srcCompat="@drawable/ic_play" 行出现错误

当我将app:srcCompat 更改为android:src 时,错误消失了,但图标看起来像素化了。

两者的主要区别是什么

app:srcCompat="@drawable/ic_play"

android:src="@drawable/ic_play"

【问题讨论】:

【参考方案1】:

app:srcCompat

是将 vector drawables 集成到您的应用程序中的最简单方法。矢量可绘制对象允许您用 XML 中定义的单个矢量图形替换多个 png 资源。虽然以前仅限于 Lollipop 和更高版本的设备

注意

截至 Android Support Library 23.3.0支持矢量绘图只能通过 app:srcCompat 加载。

您需要将 vectorDrawables.useSupportLibrary = true 添加到您的 build.gradle 文件中

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

android:src

设置一个drawable作为这个ImageView的内容。它将显示在 它的原始大小。没有自动缩放。

【讨论】:

在 Gradle 应用模块中添加 vectorDrawables.useSupportLibrary = true 时,app:srcCompact 的错误消失了 app:srcCompat 会和旧的安卓版本冲突吗?更具体地说,Api 19 是我指的最旧的版本。 哇终于可以摆脱位图图标了。 我已经在上面添加到build.gradle,但它仍然不起作用,有什么想法吗? 谢谢,我尝试了几周来了解如何停止 gradle 生成这个 pngs【参考方案2】:

如果您在 build.gradle 文件中使用 android:src="@drawable/some_vector" 而没有 vectorDrawables.useSupportLibrary = true 并且您的应用有矢量图像(可绘制矢量),那么在构建 apk 文件时,Android gradle 插件会生成很多*.png 文件用于每个矢量可绘制的不同屏幕(hdpi、xhdpi...)(仅适用于 API =apk 更大。

当使用app:srcCompat="@drawable/some_vector"vectorDrawables.useSupportLibrary = true 时,android 使用矢量可绘制文件而不生成*.png 文件。

您可以使用 Android Studio apk 分析器工具检查这一点。只需构建带有和不带有 vectorDrawables.useSupportLibrary = true 的 apk。

我认为这是主要区别。

【讨论】:

所以如果你将 useSupportLibrary 设置为 true,为什么你需要特殊的语法,而不是 android:src= ?如果你使用 android:src= 并激活了 useSupportLibrary,你会避免 PNG 的扩散吗?【参考方案3】:

用途:

app:srcCompat="@drawable/backImage"

srcCompat 属性实际上是在 AppCompat 库中定义的。 重要提示:您需要为此添加适当的命名空间。

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

注意

您得到的似乎只是一个可以忽略的 lint 错误。我已经尝试并得到了同样的错误,但它工作正常。

您可以使用tools:ignore="MissingPrefix" 暂时避免看到此错误。

我希望这会有所帮助。

【讨论】:

【参考方案4】:

AppCompatImageView(或ImageButtonFloatingActionButton 等子类)一起使用时,您将能够使用新的app:srcCompat 属性在旧版本的平台(以及android:src 可用的任何其他可绘制对象)

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

srcCompat

设置一个drawable作为这个ImageView的内容。在旧版本平台上运行时允许使用矢量可绘制对象。

可能是对另一个资源的引用,形式为 "@[+][package:]type/name" 或主题属性,形式为 "?[package:]type/name"


在使用app:srcCompat时不要忘记添加xmlns:app="http://schemas.android.com/apk/res-auto"

【讨论】:

【参考方案5】:
app:srcCompat="some_resource" 

指的是支持库中的AppCompatActivity src,而

android:src="some_resource"

指简单的活动。

【讨论】:

这很有见地。【参考方案6】:

仅在框架的最新版本中支持矢量和动画矢量。 srcCompat 可以与兼容性库一起使用以使它们工作,但这仅适用于支持库中的某些视图。请注意,使用 app: 而不是 android:。这意味着它不是框架的一部分,而是由您的应用定义的参数。

【讨论】:

【参考方案7】:

AppCompatImageView(或ImageButtonFloatingActionButton 等子类)一起使用时,您将能够使用新的app:srcCompat 属性来引用矢量可绘制对象(以及任何其他可绘制对象)可用于android:src)。如果您在运行时更改可绘制对象,您将能够使用与以前相同的 setImageResource() 方法(那里没有更改)。

使用AppCompatapp:srcCompat 是将矢量绘图集成到您的应用程序中最简单的方法。您会发现在 Lollipop 之前直接引用 app:srcCompat 之外的矢量可绘制对象将失败。

【讨论】:

【参考方案8】:

Android 5.0(API 级别 21)及更高版本提供矢量可绘制支持,因此为了支持旧版本中的矢量可绘制应用:添加了 app:srcCompat

【讨论】:

以上是关于Android 布局 XML 中 app:srcCompat 和 android:src 的区别的主要内容,如果未能解决你的问题,请参考以下文章

布局 xml 文档中的 Android“工具”命名空间

Android - 当设备改变方向时,布局土地中的布局 xml 未加载

自定义字体和 XML 布局 (Android)

从android框架覆盖布局xml

在布局 XML 中编辑 android:tag

Android中xml布局文件