“怎么做?”;?android:attr/activatedBackgroundIndicator“;工作

“怎么做?”;?android:attr/activatedBackgroundIndicator“;工作,android,Android,我正在寻找如何在显示用于选择的上下文操作栏时突出显示列表中的选定项,我找到的解决方案是将我的行布局xml的android:background属性设置为“?android:attr/activatedBackgroundIndicator” 但是,如何设置此功能 涉及的机制是什么 像“?”、“attr”、“activatedBackgroundIndicator”这样的语法元素是什么意思 “activatedBackgroundIndicator”的含义在哪里定义 我也曾一度对此感到疑惑。大量A

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

但是,如何设置此功能

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

  • 我也曾一度对此感到疑惑。大量Android资源看起来就像一个黑匣子,无法直接看到它们。我可能在某个地方丢失了它们,但在SDK源代码中找不到它们。这是我所知道的

    • android:background
      将采用可绘制的方式
    • 语法与样式相同 必须是对另一资源的引用,格式为“@[+][package:]type:name”,或对主题属性的引用,格式为“?[package:][type:]name”

    在这种情况下,
    表示查看软件包
    android
    中的主题,其类型为
    attr
    ,名称为
    activatedBackgroundIndicator

    您也应该能够使用
    android.R.attr.activatedBackgroundIndicator
    在代码隐藏中访问此内容

    Android
    attr
    属性列表可在

    • activatedBackgroundIndicator
      是安卓3.0+中定义的可绘制指示器 可绘制,用作激活项目的背景


    它基本上只是操作系统中定义的标准项。我似乎无法在Android源代码中找到,但这里有一个指向文档的链接

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

    这提供了一种重用资源值的方法。我这里说的不是性能方面,而是组织和维护方面。该属性的行为就像它是一个变量一样,承诺在运行时它将保存一个实际值

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

  • 创建您自己的主题(这只是“样式”资源的一个别致的名称),最常见的是从一个默认主题派生出来
  • 为相关属性提供您自己的值
  • 如果您为活动或应用程序指定了主题,平台将自动使用您的值。你这样做就像问题中描述的那样。主题属性引用的一般语法如下所述:。您还可以在这里找到整个机制的示例和说明

    编辑

    需要注意的一件事是实际的属性名及其在各种平台版本中的存在。在下一个平台版本中引入新属性是很常见的——例如,为了ActionBar样式,在3.0版本中添加了一些属性


    您应该将属性名称视为API的一部分——换句话说,它们是允许您使用的契约的一部分。这与类及其签名非常相似-您可以使用
    LocationManager
    类来获取最后一个设备位置,因为您从某些来源(教程、参考、官方指南等)了解此类的用途。类似地,属性名称及其用途(有时很好,有时很糟糕)也在Android平台文档中定义。

    如果你在法庭上,这里是如何挖掘和找出发生了什么

    android:background="?android:attr/activatedBackgroundIndicator"?
    
    <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>
    
    直观地说,这意味着将背景设置为可绘制的

    但是,让我们进一步分解它,看看我们是如何得到我们神秘的绘图工具的

    准确地说,它意味着“将背景属性设置为当前主题中“activatedBackgroundIndicator”属性所指的内容

    如果你理解了“当前主题中的引用”部分,你就基本上理解了封面后面发生的一切

    基本上,activatedBackgroundIndicator不是一个实际的可绘图项,而是对可绘图项的引用。那么“activatedBackgroundIndicator”属性实际定义在哪里呢

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

    android sdk/platforms/android-17/data/res/values/attrs.xml路径

    如果打开该文件,您将按如下方式声明:

    <attr name="activatedBackgroundIndicator" format="reference" />
    
    获取有关可提取数据和状态的背景信息

    “list_selector_background_selected”是一个9补丁png文件,位于drawable hdpi文件夹中


    现在您可以了解为什么我们将activatedBackgroundIndicator定义为参考,而不是直接链接到可绘制文件-它允许您根据主题选择正确的可绘制文件。

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

    样式属性资源允许您引用当前应用的主题中的属性值。引用样式属性允许您自定义UI元素的外观,方法是将其样式设置为与当前主题提供的标准变体相匹配,而不是提供硬编码的值。引用样式属性本质上是表示“在当前主题中使用此属性定义的样式。”

    要引用样式属性,名称语法几乎与规范相同
    <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>