2015-07-22 78 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);`