为什么在API 21之后需要在backgroundTint前加上android:前缀,而在API 21之前不需要?

7

当我在定义一个项目时声明样式android:backgroundTint,我会收到一个警告,说这个功能是从API 21开始可用的,而我的最低API指定是较低的(API 17)。另一方面,当我将其替换为简单的backgroundTint时,警告消失了。有人知道为什么吗?

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:backgroundTint">#0F0</item>
</style>

除此之外,如果我仅为一个组件(例如按钮)使用android:backgroundTint,无论我的项目的最低SDK是什么,都不会收到任何警告或错误提示。这有点令人困惑。


2
由于backgroundTint是在API21中引入的,因此请参阅此处。因此,此样式属于v-21样式。我认为警告是因为backgroundTint不是单独的属性,因此无法编译。 - ADM
2个回答

6
我知道这是一个老问题了,但如果你遵循这个解决方案,该解决方案指导我们将android:backgroundTint更改为app:backgroundTint,你就可以消除以下警告:

属性 backgroundTint 仅在 API 级别 21 及更高版本中使用。


1
谢谢!它确实可以与AppCompat活动或AppCompat视图一起使用 :) - xarlymg89
很高兴知道它对你有帮助,@xarlymg89!当我在寻找类似的问题时,它对我帮助很大,我认为它可以帮助其他人,而且很高兴知道它对另一个开发者真的很有用。 - JorgeAmVF

4
为什么它在运行时起作用:AppCompat支持库将许多较新的API级别功能进行了后向兼容,并且其样式定义了无前缀backgroundTint属性。 lint不发出警告的另一个原因是:未使用android:作为前缀的style属性不会被验证为已知属性名称。实际上,您可以在item name属性中放置任何字符串。例如:
<item name="iJustInventedThis">foo</item>

在布局小部件中,您会遇到缺少前缀或未知属性的lint警告。如果您有一个AppCompat小部件,例如AppCompatImageView,那么您可以使用backgroundTint属性。

所以,在样式中,您可以为名称使用任何值,但不能为单独的元素(如Button、EditText等)使用,因为它们需要前缀。对吗? - Mehdi Haghgoo
在布局小部件中,您会收到 Lint 抱怨缺少前缀或未知属性的警告。 - laalto
可能有点晚了,但是你的第一段引起了我的疑问。“...它的样式定义了无前缀的backgroundTint属性”。这是你的意思吗?我有点难理解。 - Mehdi Haghgoo

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