在大多数情况下,两者似乎都有效,但?attr/
似乎存在兼容性问题。我理解?
意味着我们指的是当前的主题价值,但是什么不能回答我的问题。
有人可以解释并提及最佳做法吗?
我正在使用一个主题,该主题继承自v21的Material主题,而来自AppCompat的较低版本。我应该注意哪些并发症?
感谢。
答案 0 :(得分:3)
定义并引用您在应用程序中自己定义的属性的值。
指的是android内置中已有的属性值。
更具体地说,?意味着额外的间接级别。可以将其视为取消引用属性以获取它指向的资源,而不是引用属性本身。您可以使用?android:attr/foo
使用的最佳做法取决于您使用的属性以及内置Android系统中是否可用,您可以使用它,否则您可以自己定义。
@android:
和?android
之间的区别是什么?
@android: - 这是对现有资源或之前声明的样式(或可绘制或维度等)的引用。
?android: - 是对当前Theme *中声明的项目的引用。一个例子可以说明这一点。我喜欢将这些视为样式变量',或者可以在主要主题声明中设置的全局属性。
让我们说我们的风格目前正在应用于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