安卓 - 如何在xml中使用v7支持库的selectableItemBackground?

80
即使我的应用程序包含了android support v7,添加android:background="?android:attr/selectableItemBackground"会导致我的IDE Eclipse报错(阻止我编译),提示selectableItemBackground仅适用于min Api 11及以上版本。如何在XML中将此属性添加到背景?请假设从更高的库复制和粘贴不是一个解决方案。
3个回答

226

由于该属性在库(支持 v7)中定义,您将使用它作为用户定义的属性:即不使用 android: 前缀:

android:background="?attr/selectableItemBackground"

你看到的错误提示指出?android:attr/selectableItemBackground只适用于API版本 >= 11。确实如此。

2
  1. 你怎么知道这个属性是支持v7而不是v4的?(我正在下载支持库的rev19版本)
  2. 你有一个使用用户自定义属性的URI的例子吗?
- Someone Somewhere
2
据我所知,v4版本没有定义任何属性。通过查看android.support.v7.appcompat.R.attr,我知道selectableItemBackground在v7版本中被定义了。至于你的第二个问题,你是想知道用户自定义属性的工作原理吗? - Vikram
我实际上已经忘记了在提出问题#2时我正在做什么。我相信以下链接回答了那个问题,特别是评论部分:https://dev59.com/3Wgu5IYBdhLWcg3w8LWv#11388952 - Someone Somewhere
14
安卓系统提供的所有内容都需要通过带有"android:"前缀的名称空间来访问。这不包括支持库,因为它们是附加组件。属性定义在attrs.xml中,在themes.xml 和/或 styles.xml中设置。因此,如果您要将自己的可绘制资源分配给selectableItemBackground,则不会使用"android:"命名空间。但是,如果可绘制资源是由安卓系统提供的,则需要使用该命名空间。 - Vikram
@Vikram,你能解释一下为什么将这个属性应用到ImageView会使它以蓝色高亮显示,但我的应用程序主题是AppCompat,我期望高亮显示的颜色是灰色,因为根据SDK/appcompat,这个属性必须使用灰色可绘制对象。 - Raman Branavitski
显示剩余2条评论

17

这里是selectedItemBackground。你可以在/platforms/android-14/data/res/themes.xml中找到它。

<selector xmlns:android="http://schemas.android.com/apk/res/android"
          android:exitFadeDuration="@android:integer/config_mediumAnimTime">

    <item android:state_window_focused="false" android:drawable="@color/transparent" />

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true"  android:state_enabled="false"                              android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true"                                android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="false"                               android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="true"                                                             android:drawable="@drawable/list_selector_background_focused" />
    <item android:drawable="@color/transparent" />

</selector>

而你可以在Android SDK目录下找到drawable资源

../platforms/android-14/data

1
那你的建议是我把它复制到主题或我的自定义drawable里面,而不是想方设法从应该能与我较旧的API级别兼容的支持库中获取它? - CQM
你可以将最低API设置为大于11,否则你必须将drawable从那里复制到你的res文件夹中。 - Sunny
我觉得我应该能够设置命名空间或其他东西来获取支持库属性。 - CQM
你可以使用 HoloEveryWhere 库,它可以在 API 7+ 上工作。 - Sunny
我使用Android支持库v7,它的作用与Holo Everywhere相同。假设支持库v7是我的唯一工具,我该如何获得相同的结果? - CQM
显示剩余3条评论

4
不是该领域的专家,但似乎您需要基于平台版本的主题。我认为官方指南解释得相当清楚。
您需要为每个版本创建不同的XML文件,并将它们保存在res/values-v7res/values-v11等中。然后为您的视图使用这些样式。类似这样:
res/values-v7中:
<style name="LightThemeSelector" parent="android:Theme.Light">
    ...
</style>

res/values-v11 中:

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
    <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
    ...
</style>

然后在视图中使用样式:

<TextView
    style="@style/LightThemeSelector"
    android:text="@string/hello" />

希望这能有所帮助。 祝好。

好的,这个元素"?android:attr/selectableItemBackground"已经在Android支持v7库中了。我不需要从其他库复制主题或编写特定于平台的代码。 - CQM
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Greg Ennis
3
这是一个很好的解决方案,因为它可以在其他视图上重复使用。然而,根据我的经验,样式定义中应该使用属性'android:background'而不是'selectableItemBackground',如下所示: <style name="LightThemeSelector" parent="android:Theme.Holo.Light"> <item name="android:background">?android:attr/selectableItemBackground</item> ... </style> - kip2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接