仅更改ImageButton背景的一个状态(默认状态)

时间:2013-03-31 22:38:57

标签: java android android-theme android-selector

我想更改图片按钮的背景。基本上我在透明背景上看起来很棒,而且当它们中的一堆都具有不透明的背景时,它们有点糟糕。

这应该很简单 - 只需将按钮上的android:background更改为透明色(通过drawable): click_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="true"><color android:color="#FF008080" />
    </item>
    <item android:state_pressed="true"><color android:color="#FF008080" />
    </item>
    <item><color android:color="#00000000" />
    </item>

</selector>

然后是按钮

<ImageButton
                android:id="@+id/players"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_gravity="center"
                android:background="@drawable/click_background"
                android:contentDescription="@string/players"
                android:src="@drawable/speaker_tile" />

问题是我实际上想要保留背景的state_focussedstate_pressed版本(我认为这是从主题派生的)。当按下或选择按钮(并且显示完全相同的颜色/可绘制)时,我希望在按下按钮时主题将使用的按钮会显示背景。

我想知道是否有办法执行以下操作之一,但到目前为止还无法找到任何内容:

  1. 定义一个选择器,在某些内容中继承自另一个(类似于主题可以从另一个继承的方式)。

  2. 创建一个全新的选择器,但让它的XML引用为用于图像按钮的主题state_focussedstate_pressed的颜色/可绘制。 编辑:看起来这个选项已经出来了。我需要属性,但你不能从drawable中引用它们。 See here

  3. 如果可能,我想在Declarative XML而不是Programmatic Java中执行此操作。

1 个答案:

答案 0 :(得分:3)

您可以将Android操作系统使用的drawable复制到项目中,并在状态列表drawable中使用它们。您可以在{android-sdk-directory}/platforms/android-##/data/res/drawable[-*dpi]

中找到图片

修改 如果您转到{android-sdk-directory}/platforms/android-##/data/res/values,则会找到Android使用的themes.xmlstyles.xml个文件。使用它们,您可以找出您要寻找的绘图。

例如,Android较新版本的默认主题是Theme.Holo。此主题具有ImageButtons的默认样式,如下所示:

<item name="imageButtonStyle">@android:style/Widget.Holo.ImageButton</item>

styles.xml中,此样式定义如下:

<style name="Widget.Holo.ImageButton" parent="Widget.ImageButton">
    <item name="android:background">@android:drawable/btn_default_holo_dark</item>
</style>

谢天谢地,背景属性就在那里定义了。有时它是从父式继承的,你必须找到它。无论如何,这里是drawable(在/drawable目录中找到,因为它是xml):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_enabled="true"
    android:drawable="@drawable/btn_default_normal_holo_dark" />
<item android:state_window_focused="false" android:state_enabled="false"
    android:drawable="@drawable/btn_default_disabled_holo_dark" />
<item android:state_pressed="true" 
    android:drawable="@drawable/btn_default_pressed_holo_dark" />
<item android:state_focused="true" android:state_enabled="true"
    android:drawable="@drawable/btn_default_focused_holo_dark" />
<item android:state_enabled="true"
    android:drawable="@drawable/btn_default_normal_holo_dark" />
<item android:state_focused="true"
    android:drawable="@drawable/btn_default_disabled_focused_holo_dark" />
<item
     android:drawable="@drawable/btn_default_disabled_holo_dark" />
</selector>

所以这些是Android在默认(全黑暗)主题中用于标准ImageButton背景的drawables。