我一直在寻找在显示用于选择的上下文操作栏时如何突出显示列表中所选项目的方法,而我发现的解决方案是将行布局xml的android:background
属性设置为"?android:attr/activatedBackgroundIndicator"
。
设置该如何工作?
最佳答案
如果您处于法医状态,这里是如何挖掘并找出正在发生的情况的方法。
android:background="?android:attr/activatedBackgroundIndicator"?
直观地讲,这意味着将背景设置为可绘制的背景。
但是,让我们进一步分解,以了解我们如何到达神秘的可绘制对象。
确切地说,这意味着“将背景属性设置为当前主题中属性“activatedBackgroundIndicator” 所指的内容。
如果您了解“在当前主题中引用”部分,则基本上了解了幕后的所有内容。
基本上,activatedBackgroundIndicator不是实际的可绘制对象,而是对可绘制对象的引用。那么“activateBackgroundIndictor”属性在哪里定义呢?
它在sdk目录中的文件名 attrs.xml 中定义。例如:
如果打开该文件,则将进行如下声明:
<attr name="activatedBackgroundIndicator" format="reference" />
在attrs.xml中,您可以声明所有稍后将在 View xml中使用的属性。 注意,我们在声明属性及其类型,而实际上未在中分配值。
实际值在 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>
现在我们有了神秘的绘画。如果选择第一个,它将在可绘制的文件夹中定义:
如果打开该文件,您将看到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”。
有关可绘制对象和状态的背景信息,请参见this link。
“list_selector_background_selected”是位于drawable-hdpi文件夹中的 9-patch png文件。
现在您可以看到为什么我们将ActivatedBackgroundIndicator定义为引用,而不是直接链接到可绘制文件的原因-它使您可以根据主题选择合适的可绘制对象。