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】:将AppCompat
与ImageView
(或ImageButton
和FloatingActionButton
等子类)一起使用时,您将能够使用新的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】:将AppCompat
与ImageView
(或ImageButton
和FloatingActionButton
等子类)一起使用时,您将能够使用新的app:srcCompat
属性来引用矢量可绘制对象(以及任何其他可绘制对象)可用于android:src
)。如果您在运行时更改可绘制对象,您将能够使用与以前相同的 setImageResource()
方法(那里没有更改)。
使用AppCompat
和app:srcCompat
是将矢量绘图集成到您的应用程序中最简单的方法。您会发现在 Lollipop 之前直接引用 app:srcCompat
之外的矢量可绘制对象将失败。
【讨论】:
【参考方案8】:Android 5.0(API 级别 21)及更高版本提供矢量可绘制支持,因此为了支持旧版本中的矢量可绘制应用:添加了 app:srcCompat
【讨论】:
以上是关于Android 布局 XML 中 app:srcCompat 和 android:src 的区别的主要内容,如果未能解决你的问题,请参考以下文章