【问题标题】:Android: change button background programmaticallyAndroid:以编程方式更改按钮背景
【发布时间】:2011-03-07 01:52:09
【问题描述】:

我有这个颜色资源文件

<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:无论如何,如果您有更好的解决方案来更改按钮颜色,并在半秒后更改回原来的颜色,请告诉我。

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以使用如下所示的 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】:

    我们试图在 Android 中仅使用普通按钮来实现类似标签的功能。我没有成功使用 XML 获得正确的行为——一定是做错了什么。例如,只要按下按钮,我就可以让按钮颜色变为黄色,但离开时它会变回原来的颜色。

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

    // 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);
    

    【讨论】:

    • 这是否保留了标准的 android 行为,即在您按下按钮时使其变暗?
    【解决方案3】:

    setBackgroundResource 期望的是可绘制对象,而不是颜色。你想要setBackgroundColor

    另外,你的颜色应该至少有 6 位数字,#RRGGBB

    即,对于蓝色:#0000FF

    我认为你所拥有的可能相当于#00000F,接近黑色......

    最后,您不应该在 UI 线程中休眠(或更改不在 UI 线程中的 UI 项)。请参阅Painless Threading,了解使用其他线程的多种不同方式。我认为postDelayed 可能是您正在寻找的。​​p>

    【讨论】:

    • 不,按钮会变黑并且不会变回原来的颜色。至少在模拟器中。当我完成刷新我的 G1 时,我会尝试一下
    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多