返回

布局文件中 “?attr/”、“?android:”和“?android:attr/”的前缀:它们有什么不同?

Android

主题:布局文件中“?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 版本始终如一地工作。

常见问题解答

  1. 问: 什么是自定义属性?
    答: 自定义属性是你自己定义的属性,用于存储和引用你的应用程序中的特定值。
  2. 问: 我应该什么时候使用“?attr/”而不是“?android:”?
    答: 当你想要引用自定义属性或确保你的布局跨不同主题保持一致时,请使用“?attr/”。
  3. 问: “?android:attr/”如何工作的?
    答: 它首先在当前主题中查找与 Android 框架属性同名的自定义属性。如果找到,它将引用该自定义属性。否则,它将引用框架属性。
  4. 问: 我可以在哪里找到有关布局属性值的更多信息?
    答: 你可以查看 Android 开发人员网站上有关属性的文档:https://developer.android.com/reference/android/R.attr
  5. 问: 是否有任何工具可以帮助我理解这些前缀?
    答: 是的,Android Studio 有一个名为“属性透视”的工具,可以帮助你快速查找和引用属性。