ImageButton背景随自定义可绘制状态而变化

时间:2012-11-22 14:30:40

标签: android state imagebutton

我有一个自定义ImageButton课程,根据本教程How to add a custom button state模仿ToggleButton's已检查状态。

当我将状态列表作为android:src属性绘制时,一切正常,但自定义状态不适用于ImageButton's android:background属性。

这是我的代码:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Checkable;
import android.widget.ImageButton;

public class CheckableImageButton extends ImageButton implements Checkable {

    private static final int[] STATE_CHECKED = {R.attr.state_checked};

    private boolean mChecked = false;

    public CheckableImageButton(Context context) {
        super(context);
    }

    public CheckableImageButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);

        if(mChecked){
            mergeDrawableStates(drawableState, STATE_CHECKED);
        }

        return drawableState;
    }

    @Override
    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void setChecked(boolean checked) {
        mChecked = checked;
        refreshDrawableState();
    }

    @Override
    public void toggle() {
        setChecked(!mChecked);
    }
}

布局XML中的相关片段:

<com.my.package.view.CheckableImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:background="@drawable/header_button_bg"
    android:padding="5dp"
    android:src="@drawable/menu_button"
    tools:ignore="ContentDescription" />

状态列表可绘制:

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

    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#ff000000" />

            <gradient android:angle="-90" android:endColor="#d2914e" android:startColor="#906434" />

            <corners android:radius="5dp" />
        </shape>
    </item>
    <item app:state_checked="true">
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#ff000000" />

            <gradient android:angle="-90" android:endColor="#d2914e" android:startColor="#906434" />

            <corners android:radius="5dp" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#ff000000" />

            <gradient android:angle="-90" android:endColor="#4f5b6c" android:startColor="#345b75" />

            <corners android:radius="5dp" />
        </shape>
    </item>

</selector>

1 个答案:

答案 0 :(得分:0)

日食的另一个奇妙特征可能是......

当我尝试将代码手动恢复到最后一个工作版本时(android:src标记中的状态列表可绘制),它产生了同样的错误。我从SVN回购中恢复过来了。然后我做了与以前完全相同的改变,逐个字符,没有区别,并且瞧,它现在有效!

就是这样,问题中的代码完全正常运行。