2015-07-22 56 views
2

我在想这是否可能,但希望有人能够确认。如何在不改变onclick/onpress颜色的情况下更改按钮背景颜色

我已经在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> 
+0

我看到的解决方案是将颜色六保存到数据库那么每次您设置按钮时,都会使用保存的颜色 – Sheychan

+0

感谢您的所有评论。通过它的声音,没有简单的方法来做到这一点,并创建一个数据库,只是为了让按钮颜色的变化看起来有点矫枉过正。也许我最好创建几个主题,或者如果人们真的想改变按钮的颜色,就简单地丢失按下状态的颜色。如果任何人有任何简单的解决方案,那么我全力以赴,再次感谢大家的期待。 – Regnodulous

回答

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> 

编辑:如果你想采取从用户的颜色,这可能工作,如果选择状态将这段代码overrided:

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); 
+0

谢谢你的抬头。我确实考虑过这样做,但它真的限制了颜色的数量,以至于我/我可能会很难创建的多个选择器列表。我真正想要的是让用户选择他们想要的任何颜色的方法。 – Regnodulous

+0

是真的,但如果他使用颜色选择器呢?他将使数百万个选择器 – Sheychan

+0

如果您不想用颜色编号限制用户,我编辑了我的答案。不知道它会工作,但可能会有一些修改(如创建新的StateListDrawable基于2个常量状态,并且您通过用户颜色定义的转换为ColorDrawable的那个) – yshahak

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