Android:以编程方式更改按钮背景

时间:2010-06-22 22:46:44

标签: android

我有这个颜色的资源文件

<resources>
    <color name="CLR_BLUE">#00f</color>
    <color name="CLR_RED">#f00</color>
    <color name="CLR_GREEN">#0f0</color>
    <color name="CLR_YELLOW">#ff0</color>
    <color name="CLR_BLUE_DARK">#00a</color>
    <color name="CLR_RED_DARK">#a00</color>
    <color name="CLR_GREEN_DARK">#0a0</color>
    <color name="CLR_YELLOW_DARK">#aa0</color>
</resources>

当用户点击四个彩色Buttons

中的一个时,会调用此方法
private void changeBackground(Button pressedBtn)
{
    int oldColor = 0;
    int newColor = 0;

    if(pressedBtn == greenBtn) {
        oldColor = R.color.CLR_GREEN;
        newColor = R.color.CLR_GREEN_DARK;
    }
    else if (pressedBtn == redBtn) {
        oldColor = R.color.CLR_RED;
        newColor = R.color.CLR_RED_DARK;
    }
    else if (pressedBtn == yellowBtn) {
        oldColor = R.color.CLR_YELLOW;
        newColor = R.color.CLR_YELLOW_DARK;
    }
    else if (pressedBtn == blueBtn) {
        oldColor = R.color.CLR_BLUE;
        newColor = R.color.CLR_BLUE_DARK;
    }
    else return;

    pressedBtn.setBackgroundResource(newColor);
    SystemClock.sleep(500);
    pressedBtn.setBackgroundResource(oldColor);

}

问题是按下时按钮的颜色不会改变。 我踩了一个调试器,它实际上到达了方法中的正确点,所以这不是问题。我认为问题出在pressedBtn.setBackgroundResource(newColor),但我无法理解为什么。

PS:无论如何,如果你有一个更好的解决方案,在按下时改变按钮颜色,半秒后,改回原来的颜色,请告诉我。

3 个答案:

答案 0 :(得分:17)

我们尝试使用Android中的普通按钮来实现类似标签的功能。我没有成功使用XML获得正确的行为 - 必须做错事。例如,只要按下按钮,我就可以将按钮颜色变为黄色,但是当它离开时它会恢复原始颜色。

最后,通过在每个标签按钮的click事件处理程序中使用以下代码,我可以实现所需的行为。希望这可以帮助有类似问题的人。

// Get Handle for the Tab buttons
Button btnTab1 = (Button) findViewById(R.id.button_tab1);
Button btnTab2 = (Button) findViewById(R.id.button_tab1);

// set the colors correctly
btnTab1.setBackgroundResource(color.lightblue);
btnTab2.setBackgroundResource(color.darkblue);

答案 1 :(得分:11)

您可以使用下面的xml文件来创建按钮的状态。

有关可用属性的信息是here. 您只需将此xml文件复制到项目中的drawables文件夹,将其命名为custom_button.xml,并使用

在布局中引用它。

android:background="@drawable/custom_button"

这是xml文件......

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

<item android:state_pressed="true" >
    <shape android:shape="rectangle">
        <solid
            android:color="#00ff00" />
        <stroke
            android:width="5dp"
            android:color="#ff0000"
            android:dashWidth="3dp"
            android:dashGap="2dp" />
    </shape>
</item>

<item android:state_focused="true" >
    <shape>
        <gradient
            android:endColor="#ffffff"
            android:centerColor="#ffffff"
            android:startColor="#ffffff"
            android:angle="270" />
        <stroke
            android:width="3dp"
            android:color="#00ff00" />
        <corners
            android:radius="5dp" />
        <padding
            android:left="10dp"
            android:top="10dp"
            android:right="10dp"
            android:bottom="10dp" />
    </shape>
</item>

<item>        
    <shape>
        <gradient
            android:endColor="#ffffff"
            android:centerColor="#ffffff"
            android:startColor="#ffffff"
            android:angle="270" />
        <stroke
            android:width="5dp"
            android:color="#00ff00" />
        <corners
            android:radius="5dp" />
    </shape>
</item>

答案 2 :(得分:4)

setBackgroundResource期待一种抽奖,而不是一种颜色。你想要setBackgroundColor

此外,您的颜色应至少有6位数字,#RBGGBB

即,蓝色:#0000FF

我认为你拥有的东西可能等同于#00000F,它接近于黑色......

最后,你永远不应该睡在UI线程中(或者更改UI线程中没有的UI项)。有关使用其他线程的多种不同方法,请参阅Painless Threading。我认为postDelayed可能就是你要找的东西。