布局中的“?attr/xyz”、“?android:xyz”和“?android:attr/xyz”有什么区别?

问题描述 投票:0回答:1

两者似乎在大多数情况下都能工作,但

?attr/
似乎存在兼容性问题。我知道
?
意味着我们指的是当前主题值,但这是什么并不能回答我的问题。

有人可以解释并提及最佳实践吗?

我使用的主题继承自 v21 的 Material 主题和较低版本的 AppCompat 。我应该注意哪些并发症?

谢谢。

android android-layout
1个回答
3
投票

正如我在这里写的博客:

?attr/xyz

定义并引用您定义的属性的值 您自己在申请中。

?android:attr/xyz -------------------------- 指的是android内置中已经可用的属性值。

更具体地说,意味着额外的间接级别。 将其视为取消引用属性以获取其资源 指向而不是引用属性本身。你看到这个 与

?android:attr/foo

使用哪种最佳实践取决于您的属性 正在使用,如果它在内置 Android 系统中可用,那么您 可以使用它,否则你可以自己定义。

我也回答了

@android:
?android
有什么区别?

@android: -- 这是对现有资源或先前声明的样式(或可绘制或尺寸等)的引用。

?android: -- 是对当前主题*中声明的项目的引用。一个例子可以最好地说明这一点。我喜欢将这些视为 样式“变量”,或可以在主文件中设置的全局属性 主题宣言。

来自解释 android 中属性引用的文章这里

假设我们有一种当前应用于股票的样式 小部件,

ExpandableListView
风格。对于我们的应用程序,我们想要 覆盖 groupIndicatorchildDivider 样式。

<style name="Widget.Holo.ExpandableListView" parent="Widget.Holo.ListView">
  <item name="groupIndicator">@android:drawable/expander_group_holo_dark</item>
  ...
  <item name="android:childDivider">?android:attr/listDivider</item>
</style>

groupIndicator 使用

@android
对库存可绘制对象的引用。要覆盖它,我们需要创建一个新样式(即 有
Widget.Holo.ExpandableListView
的父级)并覆盖 groupIndicator 具有新的可绘制对象。然后我们需要设置样式 在我们的 ExpandableListView 上,或者将 ExpandableListViews 的样式设置为 使用新样式或通过直接将其传递给视图的样式 构造函数。

childDivider 使用

?android
属性引用。这更容易被覆盖。在主应用程序主题中,添加一个设置的项目 此属性。

有关更多详细信息,请检查引用属性

© www.soinside.com 2019 - 2024. All rights reserved.