android:attr / activatedBackgroundIndicator如何工作?


86

我一直在寻找在显示用于选择的上下文操作栏时如何突出显示列表中的选定项目,而我发现的解决方案是将android:background行布局xml的属性设置为"?android:attr/activatedBackgroundIndicator"

设置该如何工作?

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

Answers:


221

如果您处于法医状态,这里是如何挖掘并找出正在发生的情况的方法。

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。


3
一种统治一切的答案。因此,基本上,如果要使用相同的选择器制作XML,他可以制作自己的“ activatedBackgroundIndicator”吗?
Gee.E 2014年

1
准确-您可以在自定义theme.xml中重新定义它的引用属性。
努曼萨拉蒂2014年

这个答案帮助我弄清楚了如何在导航抽屉列表项上设置自定义可绘制对象。
Deliciousbrownies 2014年

这是开始selector使用可绘制对象进行自定义工作的重要资源。阅读此内容后,我使用了“样式属性文档”来填写其余部分。
毛里齐奥2014年

1
您能否提供一个示例来说明如何覆盖此背景指标?我的不起作用:/ <style name =“ AppTheme” parent =“ Theme.AppCompat.Light.DarkActionBar”> <item name =“ android:activatedBackgroundIndicator”> @ drawable / activated_background </ item> </ style> :<selector xmlns:android =“ schemas.android.com/apk/res/android ”> <item android:state_activated =“ true” android:drawable =“ @ color / yellow” /> <item android:drawable =“ @ android:color / transparent“ /> </ selector>
vandus 2014年

13

我也想知道这一点。大量的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


5

这是从主题附加值的一种形式。在资源编译期间,该值在技术上是未知的,因为此时可能不知道主题值。取而代之的是,该值会在运行时根据来自(最常见)的实际主题进行解析ContextThemeWrapper

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

这种方法还允许更大的自定义-而不是硬编码例如窗口背景可绘制对象的值,而是从主题获取实际可绘制对象,并提供选定的属性作为键。这让覆盖该属性的值。您只需要:

  1. 创建您自己的主题(这只​​是“样式”资源的奇特名称),通常来自默认主题之一。
  2. 为相关属性提供您自己的值。

如果您为活动或应用程序指定了主题,平台将自动使用您的值。您可以按照问题中的描述进行操作。此处描述了主题属性引用的一般语法:引用样式属性。您还将在此找到整个机制的示例和说明。

编辑

应该注意的一件事是实际的属性名称及其在各种平台版本中的存在。在下一平台版本中引入新属性是相当普遍的-例如,在3.0版中出于ActionBar样式的目的添加了一些新属性。

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


2

更新:API指南中提供了更详细的版本,因此我想引用它。

样式属性资源允许您在当前应用的主题中引用属性的值。引用样式属性,可以通过对UI元素进行样式设置以匹配当前主题提供的标准变体来自定义UI元素的外观,而不是提供硬编码值。引用样式属性本质上说:“在当前主题中使用此属性定义的样式。”

要引用样式属性,名称语法几乎与常规资源格式相同,但是使用问号(?)代替符号(@),并且资源类型部分是可选的。例如:

原始答案:

努曼·萨拉蒂(numan salati)已经提供了一个完美的答案,但它没有解决“?” 句法。这是《 API指南》的参考语录

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

?[<程序包名称>:] [<资源类型> /] <资源名称>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.