我一直在寻找在显示用于选择的上下文操作栏时如何突出显示列表中的选定项目,而我发现的解决方案是将android:background行布局xml的属性设置为"?android:attr/activatedBackgroundIndicator"。
设置该如何工作?
- 涉及的机制是什么?
- 像“?”,“ attr”,“ activatedBackgroundIndicator”这样的语法元素是什么意思?
- “ activatedBackgroundIndicator”的含义在哪里定义?
Answers:
如果您处于法医状态,这里是如何挖掘并找出正在发生的情况的方法。
android:background="?android:attr/activatedBackgroundIndicator"?
直观上,这意味着将背景设置为可绘制的。
但是,让我们进一步分解以了解我们如何到达我们的神秘绘画。
确切地说,这意味着“将背景属性设置为当前主题中属性“ activatedBackgroundIndicator”所指的内容。
如果您了解“在当前主题中引用”部分,则基本上了解了幕后的所有内容。
基本上,activatedBackgroundIndicator不是实际的可绘制对象,而是对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中使用的属性。请注意,我们在声明属性及其类型,实际上并未在此处分配值。
实际值在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>
现在我们有了神秘的绘画。如果选择第一个,它将在可绘制文件夹中定义:
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>
在这里,我们定义了具有两个状态的可绘制对象-默认状态仅是透明背景,如果状态为“ state_activated”,则我们的可绘制对象为“ list_selector_background_selected”。
有关可绘制对象和状态的背景信息,请参见此链接。
“ list_selector_background_selected”是位于drawable-hdpi文件夹中的9补丁png文件。
现在您可以看到为什么我们将ActivatedBackgroundIndicator定义为参考,而不是直接链接到drawable文件-它使您可以根据主题选择正确的drawable。
我也想知道这一点。大量的Android资源似乎就像一个黑盒子,无法直接看到它们。我可能在某些地方缺少它们,但是我在SDK源代码中找不到它们。这是我所知道的。
android:background 将需要绘制。必须以“ @ [+] [package:] type:name”的形式引用另一个资源,或以“?[package:] [type:] name”的形式引用主题属性。
在这种情况下,?表示要查看包中的主题,android并且该主题的类型attr为name activatedBackgroundIndicator。
您也应该能够在后面的代码中访问它android.R.attr.activatedBackgroundIndicator。
attr可以在R.attr中找到Android属性的列表
activatedBackgroundIndicator 是Android 3.0+中定义的可绘制对象,
Drawable用作激活项的背景。
它基本上只是操作系统中定义的标准项目。我似乎在Android源代码中找不到,但是这里是文档的链接。ActivatedBackgroundIndicator
这是从主题附加值的一种形式。在资源编译期间,该值在技术上是未知的,因为此时可能不知道主题值。取而代之的是,该值会在运行时根据来自(最常见)的实际主题进行解析ContextThemeWrapper。
这提供了一种重用资源值的方法。在这里我不是在谈论性能,而是在组织和维护方面。该属性将其作为变量使用,并承诺在运行时将保留实际值。
这种方法还允许更大的自定义-而不是硬编码例如窗口背景可绘制对象的值,而是从主题获取实际可绘制对象,并提供选定的属性作为键。这让你覆盖该属性的值。您只需要:
如果您为活动或应用程序指定了主题,平台将自动使用您的值。您可以按照问题中的描述进行操作。此处描述了主题属性引用的一般语法:引用样式属性。您还将在此找到整个机制的示例和说明。
编辑
应该注意的一件事是实际的属性名称及其在各种平台版本中的存在。在下一平台版本中引入新属性是相当普遍的-例如,在3.0版中出于ActionBar样式的目的添加了一些新属性。
您应该将属性名称视为API的一部分-换句话说,它们是允许使用的合同的一部分。这与类及其签名非常相似-您使用LocationManager类是为了获取最后的设备位置,因为您从某些来源(教程,参考资料,官方指南等)知道该类的目的是什么。同样,属性名称及其用途在Android平台文档中定义(有时很好,有时很痛苦)。
更新:API指南中提供了更详细的版本,因此我想引用它。
样式属性资源允许您在当前应用的主题中引用属性的值。引用样式属性,可以通过对UI元素进行样式设置以匹配当前主题提供的标准变体来自定义UI元素的外观,而不是提供硬编码值。引用样式属性本质上说:“在当前主题中使用此属性定义的样式。”
要引用样式属性,名称语法几乎与常规资源格式相同,但是使用问号(?)代替符号(@),并且资源类型部分是可选的。例如:
原始答案:
努曼·萨拉蒂(numan salati)已经提供了一个完美的答案,但它没有解决“?” 句法。这是《 API指南》的参考语录
要引用样式属性,名称语法几乎与普通资源格式相同,但是使用问号(?)代替符号(@),并且资源类型部分是可选的。例如:
?[<程序包名称>:] [<资源类型> /] <资源名称>