代码之家  ›  专栏  ›  技术社区  ›  Federico klez Culloca

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

  •  4
  • Federico klez Culloca  · 技术社区  · 14 年前

    我有这个颜色资源文件

    <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) 但我不明白为什么。

    附言:不管怎样,如果你有更好的解决方案来改变按钮的颜色时,按下,半秒后,改变回原来的颜色,让我知道。

    3 回复  |  直到 10 年前
        1
  •  11
  •   AndrewNR    10 年前

    您可以使用下面这样的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
  •  17
  •   Sandy1978    12 年前

    我们试图在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);
    
        3
  •  4
  •   Cheryl Simon    14 年前

    setBackgroundResource 要求的是可拖动的,而不是颜色。你想要 setBackgroundColor .

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

    例如,蓝色:

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

    最后,您不应该在UI线程中睡眠(或者更改不在UI线程中的UI项)。见 Painless Threading 对于许多不同的使用其他线程的方法。我认为 postDelayed 可能是你想要的。