android-在支持v7的xml中应用selectableItemBackground


73

即使我的应用程序中包含android支持v7

android:background="?android:attr/selectableItemBackground"

使我的IDE Eclipse抛出一个错误(阻止我进行编译),通知我selectableItemBackground仅适用于最小Api 11及更高版本。

如何将此属性添加到XML的背景中?

假定从高级库复制和粘贴不是解决方案

Answers:


215

由于属性是在库中定义的(支持v7),因此您可以将其用作用户定义的属性:即不带android:前缀:

android:background="?attr/selectableItemBackground"

您看到的错误指出了?android:attr/selectableItemBackgroundAPI版本> = 11可用的错误。的确如此。


2
1)您怎么知道该属性在支持v7中而不在v4中?(目前我正在下载support lib的rev19)2)您是否有使用用户定义属性的URI示例?
某处某人2014年

2
@SomeoneSomewhere据我所知,v4没有定义任何属性。我知道这selectableItemBackground是通过查看android.support.v7.appcompat.R.attr在v7中定义的。关于第二个问题,您是否在询问用户定义属性的工作方式?
维克拉姆

实际上,我忘记了提出第2个问题时的工作。我相信以下链接回答了该问题,尤其是评论:stackoverflow.com/a/11388952/550471
某处某人2014年

13
@SomeoneSomewhere通过android:命名空间前缀访问Android系统提供的任何内容。这不包括支持库,因为它们是附加组件。属性attrs.xmlthemes.xml和/或中定义,并在中设置styles.xml。因此,如果要将自己的drawable分配给selectableItemBackground,则不会使用android:名称空间。但是,如果可绘制对象是由Android系统提供的,那么您会的。
维克拉姆

@Vikram如何使用Java将背景设置为“ attr / selectableItemBackground”?
Prakhar'1

16

这是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目录中找到可绘制对象

../platforms/android-14/data

1
因此,您建议我将其复制到主题或我自己的可绘制对象,而不是想知道如何将其从应该与较旧的api级别一起使用的支持库中删除?
CQM 2013年

您可以将最小api设置为大于11,否则必须从那里复制可绘制对象到res文件夹中。
2013年

我觉得我应该能够设置名称空间或支持库属性的东西
CQM 2013年

您可以使用HoloEveryWhere库从API 7+开始运行。
2013年

我使用android支持库v7,它在任何地方都具有与holo相同的目的,假设支持库v7是我唯一的工具,我如何获得相同的结果?
CQM 2013年

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 2013年

2
实际上,kraxor很好地针对了不同API级别的自定义背景。例如API 21 21(即使有程序兼容性)之前不支持的连锁反应,所以你可能想风格的项目背景不同
格雷格·恩尼斯

3
这是一个很好的解决方案,因为它可以在其他视图上重用。但是,以我的经验,样式定义中的属性应为“ android:background”而不是“ selectableItemBackground”,例如:<style name="LightThemeSelector" parent="android:Theme.Holo.Light"> <item name="android:background">?android:attr/selectableItemBackground</item> ... </style>
kip2 2015年
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.