如何在不更改onclick / onpress颜色的情况下更改按钮背景颜色

时间:2015-07-22 07:52:37

标签: java android android-studio

我想知道这是否可能,但希望有人能够证实。

我在XML中创建了一个简单的自定义按钮布局来处理聚焦/按下和休眠状态。请参阅底部的代码。当我用它来创建一个新按钮时,这很好用。但是,我希望用户能够通过颜色选择器更改按钮颜色,如果他们不喜欢默认颜色。但是,我知道以编程方式更改按钮背景颜色的唯一方法是使用

mybutton.setBackgroundColor(someothercolor);

但如果我这样做,它会覆盖所有XML布局代码,并且在按下按钮时会丢失颜色更改。我想这是设计的,因为我基本上覆盖了整个背景样式,但我真正想要做的是允许用户在没有按下自定义但保持其他状态的样式和布局时更改按钮颜色按钮可以在(即按下时会发生什么)。

任何想法?

提前谢谢你。

纳特

<?xml version="1.0" encoding="utf-8"?>


<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:drawable="@color/originalbuttoncolor" />
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
    <item android:drawable="@color/originalbuttoncolor" />
</selector>

3 个答案:

答案 0 :(得分:2)

也许您可以考虑以编程方式创建ColorStateList,如下所述:How do I create ColorStateList programmatically?

答案 1 :(得分:1)

你可以试试这个:
1.删​​除默认颜色<item android:drawable="@color/originalbuttoncolor" /> 2.然后

`StateListDrawable ret = (StateListDrawable) res.getDrawable(R.drawable.btn_selector);
    ret.addState(new int[] {}, new ColorDrawable(your_desire_color));
    mybutton.setBackgroundDrawable(ret);`

答案 2 :(得分:0)

您可以制作选择列表的多个文件,每个文件包含不同的颜色作为默认颜色,并将这些文件链接到颜色选择器,这样就可以保存选择器的逻辑。

例如:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:drawable="@color/originalbuttoncolor" />
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
    <item android:drawable="@color/originalbuttoncolor" />
</selector>

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:drawable="@color/yellowbuttoncolor" />
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@color/someotherbuttoncolor" />
    <item android:drawable="@color/originalbuttoncolor" />
</selector>

编辑:如果你想从用户那里获取颜色,如果这个代码覆盖了选择器状态,这可能会有效:

ColorDrawable cd = new ColorDrawable(); // initialize it from the color picker;
StateListDrawable states = (StateListDrawable) mybutton.getBackground();
states.addState(new int[] {-android.R.attr.state_pressed, android.R.attr.state_focused}, cd); // the minus means false value
mybutton.setBackground(states);