布局中“?attr / xyz”,“?android:xyz”和“?android:attr / xyz”之间的区别是什么?

时间:2015-02-03 05:06:38

标签: android android-layout

在大多数情况下,两者似乎都有效,但?attr/似乎存在兼容性问题。我理解?意味着我们指的是当前的主题价值,但是什么不能回答我的问题。

有人可以解释并提及最佳做法吗?

我正在使用一个主题,该主题继承自v21的Material主题,而来自AppCompat的较低版本。我应该注意哪些并发症?

感谢。

1 个答案:

答案 0 :(得分:3)

?ATTR / XYZ

定义并引用您在应用程序中自己定义的属性的值。

?android:attr / xyz

指的是android内置中已有的属性值。

更具体地说,意味着额外的间接级别。可以将其视为取消引用属性以获取它指向的资源,而不是引用属性本身。您可以使用?android:attr/foo

查看此信息

使用的最佳做法取决于您使用的属性以及内置Android系统中是否可用,您可以使用它,否则您可以自己定义。

@android:?android之间的区别是什么?

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

?android: - 是对当前Theme *中声明的项目的引用。一个例子可以说明这一点。我喜欢将这些视为样式变量',或者可以在主要主题声明中设置的全局属性。

来自解释有关在android HERE

中引用属性的文章

让我们说我们的风格目前正在应用于ExpandableListView风格的股票小工具。对于我们的应用,我们希望覆盖 groupIndicator childDivider 样式。

<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)并使用新的drawable覆盖groupIndicator。然后我们需要在ExpandableListView上设置样式,或者将ExpandableListViews的样式设置为使用新样式或直接通过构造函数将样式传递给视图。

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

有关详细信息,请查看Referencing attributes