两者似乎在大多数情况下都能工作,但
?attr/
似乎存在兼容性问题。我知道 ?
意味着我们指的是当前主题值,但这是什么并不能回答我的问题。
有人可以解释并提及最佳实践吗?
我使用的主题继承自 v21 的 Material 主题和较低版本的 AppCompat 。我应该注意哪些并发症?
谢谢。
正如我在这里写的博客:
?attr/xyz
定义并引用您定义的属性的值 您自己在申请中。
?android:attr/xyz -------------------------- 指的是android内置中已经可用的属性值。
更具体地说,?意味着额外的间接级别。 将其视为取消引用属性以获取其资源 指向而不是引用属性本身。你看到这个 与
?android:attr/foo
使用哪种最佳实践取决于您的属性 正在使用,如果它在内置 Android 系统中可用,那么您 可以使用它,否则你可以自己定义。
我也回答了
@android:
和?android
有什么区别?
@android: -- 这是对现有资源或先前声明的样式(或可绘制或尺寸等)的引用。
?android: -- 是对当前主题*中声明的项目的引用。一个例子可以最好地说明这一点。我喜欢将这些视为 样式“变量”,或可以在主文件中设置的全局属性 主题宣言。
来自解释 android 中属性引用的文章这里:
假设我们有一种当前应用于股票的样式 小部件,
风格。对于我们的应用程序,我们想要 覆盖 groupIndicator 和 childDivider 样式。ExpandableListView
<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
的父级)并覆盖 groupIndicator 具有新的可绘制对象。然后我们需要设置样式 在我们的 ExpandableListView 上,或者将 ExpandableListViews 的样式设置为 使用新样式或通过直接将其传递给视图的样式 构造函数。Widget.Holo.ExpandableListView
childDivider 使用
属性引用。这更容易被覆盖。在主应用程序主题中,添加一个设置的项目 此属性。?android
有关更多详细信息,请检查引用属性