在属性格式中(以颜色为例),'color' 和 'color|reference' 有什么区别?

In an attribute's format (and using Color as an example), what is the difference between 'color' and 'color|reference'?

TLDR 版本

我明白为什么 reference 在设置默认主题时用作指向默认样式的属性的格式,但是使用 reference|color 与仅使用 color 有何不同定义颜色属性?您已经可以使用 @color/xxx ,它已经是对另一个资源的引用,所以引用是隐式的吗?如果不是,一个比另一个的用例是什么?

完整版

我一直在遵循使用以下推荐技术为应用程序的自定义小部件设置主题的最佳实践。

在attrs.xml

<!-- Attributes holding default styles -->
<attr name="myWidgetStyle"      format="reference" />
<attr name="myOtherWidgetStyle" format="reference" />

<!-- Custom attributes -->
<attr name="indicatorColor" format="color|reference" />

<!-- Assigning attributes to controls -->
<declare-styleable name="MyWidget">
    <item name="android:text" />
    <item name="indicatorColor" />
</declare-styleable>

<declare-styleable name="MyOtherWidget">
    <item name="android:text" />
    <item name="indicatorColor" />
</declare-styleable>

在styles.xml

<style name="ThemeBase">

    <!-- Store default style in the style-reference attributes -->
    <item name="myWidgetStyle">@style/MyWidget</item>
    <item name="myOtherWidgetStyle">@style/MyOtherWidget</item>

    <!-- Reference primaryColor attribute when defining the value for this one -->
    <item name="indicatorColor">?primaryColor</item>
    <!-- alternate: <item name="indicatorColor">?attr/primaryColor</item> -->

</style>

<style name="ThemeA" parent="ThemeBase">
    <item name="primaryColor">@color/primaryColor_themeA</item>
</style>

<style name="ThemeB" parent="ThemeBase">
    <item name="primaryColor">@color/primaryColor_themeB</item>
</style>

最后,在我的小部件的构造函数中,我将 R.attr.myWidgetStyleR.attr.myOtherWidgetStyle 传递给对 super 以及 context.obtainStyledAttributescontext.obtainStyledAttributes 的调用我可以根据需要获得定义的颜色。一切都按预期工作。我的控件主题恰当。

但是,我想知道的是我有时会在 attrs.xml 文件中看到这个...

<attr name="indicatorColor" format="color" /> <-- Note no 'reference'

一切仍然有效,让我摸不着头脑为什么要写 color|reference 而不是 color。我已经尝试通过多个属性进行级联更改,以不同的顺序定义它们以及我能想到的任何其他方法以获得不同的结果,但它们都有效。

所以有人有解释吗?

更好的是,有人可以 post 一个显示 colorcolor|reference 之间不同行为的例子,因为到目前为止,我还没有找到一个。

吼!

属性格式只是为了让系统知道这个属性可以是什么类型的资源。

color = 任何颜色。十六进制 (#ffffffff) 或 link 为资源着色 (@color/supa-awesome_color)。这里不允许@drawable/mega_icon

reference = 任何参考 (@color/supa_awesome_color, @drawable/mega_icon, @string/hi_there, ...)

color|reference = 是以上的并集