“?android:attr / activatedBackgroundIndicator”是如何工作的?

我正在寻找如何突出显示列表中选定的项目,当显示select的上下文操作栏,我find的解决scheme是将我的行布局xml的android:background属性设置为"?android:attr/activatedBackgroundIndicator"

如何设置这个工作呢?

  1. 涉及的机制是什么?
  2. “?”,“attr”,“activatedBackgroundIndicator”等语法元素是什么意思?
  3. “activatedBackgroundIndicator”的含义在哪里定义的?

如果你是在法医的心情,这里是如何挖掘和发现是怎么回事。

 android:background="?android:attr/activatedBackgroundIndicator"? 

直观地说,这意味着将背景设置为可绘制的。

但让我们进一步分解,看看我们如何得到我们的神秘drawable。

确切地说,这意味着“将背景属性设置为属性”activatedBackgroundIndicator“ 在当前主题中引用的内容

如果你明白“是指在现在的主题”部分,你已经基本理解了封面背后发生的一切。

基本上, activateBackgroundIndicator不是一个实际的drawable,而是一个drawable的引用 。 那么“activateBackgroundIndictor”属性实际定义在哪里呢?

它在您的sdk目录中以文件名attrs.xml定义 。 例如:

path_to_android_sdk / platforms / android-17 / data / res / values / attrs.xml

如果你打开这个文件,你的声明如下:

 <attr name="activatedBackgroundIndicator" format="reference" /> 

attrs.xml是你声明你以后要在视图xml中使用的所有属性的地方。 请注意,我们正在声明属性及其types,而不是在这里实际赋值

实际值是在themes.xml中分配的。 该文件位于:

path_to_android_sdk / platforms / android-17 / data / res / values / themes.xml

如果您打开该文件,您将看到多个定义取决于您正在使用的主题 。 例如,以下是主题名称Theme,Theme.Light,Theme.Holo,Theme.Holo.Light的定义:

 <item name="activatedBackgroundIndicator">@android:drawable/activated_background</item> <item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item> <item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item> <item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item> 

现在我们有我们的神秘可绘画。 如果您select第一个,则在可绘制文件夹中定义:

path_to_android_sdk / platforms / android-17 / data / res / drawable / activated_background.xml

如果你打开这个文件,你会看到drawable的定义,这对于理解正在发生的事情很重要。

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" /> <item android:drawable="@color/transparent" /> </selector> 

这里我们定义了一个具有两种状态的drawable – 默认状态只是透明背景,如果状态是“state_activated”,那么我们的drawable就是“list_selector_background_selected”。

请参阅此链接了解有关绘图和状态的背景信息。

“list_selector_background_selected”是位于drawable-hdpi文件夹中的9个patch png文件。

现在你可以看到为什么我们将activateBackgroundIndicator定义为引用而不是直接链接到可绘制文件 – 它允许你根据你的主题select正确的drawable。

我也想知道这一点。 大量的Android资源似乎像一个黑盒子,不能直接看到它们。 我可能会错过他们的地方,但我无法在SDK源代码中find它们。 这是我所知道的。

  • android:background会绘制一个drawable。
  • 语法是在样式中

    必须以“@ [+] [package:] type:name”格式或以“?[package:] [type:] name”forms的另一个资源的引用,

在这种情况下, 表示查看包android中的主题,它的types是attr ,其中的名称是activatedBackgroundIndicator

你应该可以在android.R.attr.activatedBackgroundIndicator的代码后面访问它。

可以在R.attrfindAndroid attr列表

  • activatedBackgroundIndicator是Android 3.0+中定义的可绘制的

    Drawable用作激活项目的背景。

这基本上只是在OS中定义的一个标准项目。 我似乎无法在Android源中find,但这里是一个链接到文档。 activatedBackgroundIndicator

这是附加主题值的一种forms。 在资源编译过程中,这个值在技术上是不可知的,因为这个时候可能不知道主题值。 而是根据从最常见的ContextThemeWrapper获取的实际主题,在运行时parsing该值。

这提供了重用资源值的方法。 我不是在这里谈论性能方面,而是在组织和维护方面。 该属性作为一个variables,承诺在运行时将保存实际值。

这种方法还允许更大的自定义 – 而不是硬编码窗口背景的价值,例如,可以从一个主题获得实际的可绘制的值,提供一个选定的属性作为关键。 这使您可以覆盖该属性的值。 你只需要:

  1. 创build自己的主题(这只​​是“风格”资源的一个奇特名称),最常见的来自默认主题之一。
  2. 为有问题的属性提供自己的值。

只要您为活动或应用程序指定了主题,平台就会自动使用您的价值。 你这样做就像问题中所描述的那样。 主题 – 属性引用的一般语法如下所述: 引用样式属性 。 你还会在那里find整个机制的例子和描述。

编辑

有一点需要注意的是实际的属性名称及其在各种平台版本中的存在。 在下一个平台版本中引入新的属性是相当常见的 – 例如,为了ActionBar样式的目的,在3.0版本中添加了一些新的属性。

您应该将属性名称作为API的一部分 – 换句话说,它们是您允许使用的合约的一部分。 这与类和它们的签名非常相似 – 您使用LocationManager类来获取最后一个设备位置,因为您从某些源 (教程,参考,官方指南等)知道这个类的目的是什么。 同样,Android平台文档中定义的属性名称及其用途(有时很好,有时很悲惨)。

numan萨拉蒂已经提供了一个完美的答案,但它没有解决“?” 句法。 以下是API指南访问资源的引用

要引用样式属性,名称语法几乎与普通资源格式相同,但是使用问号(?)而不是at符号(@),资源types部分是可选的。 例如:

?[<软件包>:] [<RESOURCE_TYPE> / <RESOURCE_NAME>