以编程方式设置ImageButton状态

时间:2013-02-06 18:40:12

标签: android

我有几个ImageButtons,我试图强制其中一个像CheckBox一样。当用户按下按钮时,我想要在“按下”(橙色,如点击并按住)和“正常”状态之间切换按钮的背景。怎么样?下面的代码并没有真正做到这一点。

    public void btnErase_click(View v) {
        ImageButton btnErase = (ImageButton) findViewById(R.id.btnErase);
        if (pressed == true)
            btnErase.setBackgroundColor(Color.YELLOW);
        else        
            btnErase.setBackgroundColor(android.R.drawable.btn_default);
    }

4 个答案:

答案 0 :(得分:1)

您应该在setBackgroundResource子句中使用setBackgroundCOlor代替else。因为android.R.drawable.btn_defaul不是颜色,所以它是资源的id。

答案 1 :(得分:1)

您可以尝试这样做,通过xml设置不同的状态,将其保存在drawable中,然后将其设置为按钮的背景:

<item android:state_pressed="true"><shape>
        <solid android:color="#3c3c3c" />

        <stroke android:width="0.5dp" android:color="#3399cc" />

        <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="4dp" android:topRightRadius="4dp" />

        <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
    </shape></item>
<item><shape>
        <gradient android:angle="270" android:endColor="#171717" android:startColor="#505050" />

        <stroke android:width="0.5dp" android:color="#3399cc" />

        <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="4dp" android:topRightRadius="4dp" />

        <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
    </shape></item>

答案 2 :(得分:1)

首先,提供选择器。将其另存为drawable / button_bg.xml

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

    <item android:state_checked="true" android:drawable="@android:color/yellow" />
    <item drawable="@android:drawable/btn_default" />

</selector>

将其作为背景应用于您的按钮。 在代码中

public void btnErase_click(View v) {
    ImageButton btnErase = (ImageButton) findViewById(R.id.btnErase);
    if (pressed) {
        btnErase.getBackground().setState(new int[]{android.R.attr.state_selected});
    } else {
        btnErase.getBackground().setState(new int[]{-android.R.attr.state_selected});
    }
}

但我认为这不是一个好主意。如果您的按钮有两种状态,请更好地使用ToggleButton

答案 3 :(得分:1)

您应该使用传入的View v,而无需再次找到ImageButton。

另外,如果您将按钮背景设置为图像,请使用setBackgroundResource代替setBackgroundColor

public void btnErase_click(View v) {
        ImageButton btnErase = (ImageButton) v;
        if (pressed == true)
            btnErase.setBackgroundColor(Color.YELLOW);
        else        
            btnErase.setBackgroundResource(android.R.drawable.btn_default);
    }