返回
布局文件中 “?attr/”、“?android:”和“?android:attr/”的前缀:它们有什么不同?
Android
2024-03-29 20:21:04
主题:布局文件中“?attr/”、“?android:”和“?android:attr/”的前缀的区别
引言
当你在布局文件中处理属性值时,“?attr/”、“?android:”和“?android:attr/”这三个前缀都会让你感到困惑。它们都表示对属性值的引用,但它们之间存在一些关键区别。了解这些区别对于创建灵活且可维护的布局至关重要。
“?attr/”
- 引用当前主题中的属性值。
- 可以引用你定义的自定义属性。
- 与主题无关,这意味着无论应用了哪个主题,它都将引用当前主题中的属性值。
例如:<TextView android:textColor="?attr/textColorPrimary" />
“?android:”
- 引用 Android 框架提供的属性值。
- 只能引用 Android 框架定义的属性。
- 与主题相关,这意味着它会根据应用的主题而引用不同的属性值。
例如:<TextView android:layout_width="?android:dimen/activity_horizontal_margin" />
“?android:attr/”
- 引用当前主题中与 Android 框架属性同名的自定义属性值。
- 如果当前主题中不存在同名自定义属性,则会回退到框架属性值。
- 与主题相关,因此会根据应用的主题而引用不同的属性值。
例如:<TextView android:textColor="?android:attr/textColorPrimary" />
使用最佳实践
- 一般规则:
- 优先使用“?attr/”引用自定义属性。
- 对于框架属性,优先使用“?android:attr/”。
- 仅在必须引用框架属性的原始值时使用“?android:”。
- 具体情况:
- 跨版本支持: 如果你需要在使用不同主题的多个 Android 版本中支持你的布局,请使用“?attr/”。
- 自定义主题: 如果你使用自定义主题,并且希望你的布局从主题中继承特定属性,请使用“?android:attr/”。
- 避免混淆: 请避免在同一布局文件中混合使用“?attr/”和“?android:attr/”。
特定案例分析
假设你正在使用一个继承自 Material 主题(v21)和 AppCompat(较低版本)的主题。在这种情况下,你需要注意以下几点:
- Material 主题引入了自定义属性,这些属性可能与 AppCompat 中的同名属性不同。
- 当你使用“?android:attr/”引用一个属性时,在使用 Material 主题时,它将引用 Material 主题中的自定义属性值。在使用 AppCompat 时,它将引用 AppCompat 中的框架属性值。
- 因此,如果你希望你的布局在使用 Material 主题和 AppCompat 时都具有相同的行为,则应使用“?attr/”来引用自定义属性。
总结
通过理解“?attr/”、“?android:”和“?android:attr/”之间的区别,你可以创建更加灵活和可维护的布局。遵循最佳实践可以确保你的布局跨不同主题和 Android 版本始终如一地工作。
常见问题解答
- 问: 什么是自定义属性?
答: 自定义属性是你自己定义的属性,用于存储和引用你的应用程序中的特定值。 - 问: 我应该什么时候使用“?attr/”而不是“?android:”?
答: 当你想要引用自定义属性或确保你的布局跨不同主题保持一致时,请使用“?attr/”。 - 问: “?android:attr/”如何工作的?
答: 它首先在当前主题中查找与 Android 框架属性同名的自定义属性。如果找到,它将引用该自定义属性。否则,它将引用框架属性。 - 问: 我可以在哪里找到有关布局属性值的更多信息?
答: 你可以查看 Android 开发人员网站上有关属性的文档:https://developer.android.com/reference/android/R.attr - 问: 是否有任何工具可以帮助我理解这些前缀?
答: 是的,Android Studio 有一个名为“属性透视”的工具,可以帮助你快速查找和引用属性。