2015-07-22 3 views
2

Мне интересно, возможно ли это, но, надеюсь, кто-то сможет подтвердить.Как изменить цвет фона кнопки без изменения цветов onclick/onpress

Я создал простой пользовательский макет кнопки в XML для обработки сфокусированных/нажатых и спящих состояний. См. Код внизу. Это отлично работает, когда я использую его для создания новой кнопки. Тем не менее, я хотел бы, чтобы пользователь мог изменить цвет кнопки с помощью набора цветов, если они не нравятся по умолчанию. Однако, единственный способ я знаю, чтобы изменить цвет фона кнопки программно является использование

mybutton.setBackgroundColor(someothercolor); 

, но если я сделаю это переписывает весь код разметки XML и я теряю изменение цвета при нажатии на кнопку. Я предполагаю, что это по дизайну, поскольку я по существу переписываю весь стиль фона, но я действительно хочу сделать это, чтобы позволить пользователю изменять цвет кнопки, когда он не нажимается на что-то обычай, но сохраняет стиль и расположение других состояний кнопка может быть (т.е. что происходит, когда она нажата).

Любые идеи кто-нибудь?

Заранее спасибо.

Nat

<?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

Решение я вижу, чтобы сохранить цвет Hexa в базу данных то каждый раз, когда вы устанавливаете кнопку, он использует этот сохраненный цвет. – Sheychan

+0

Спасибо за все комментарии. По звуку этого нет простого способа сделать это, и создание db только для того, чтобы позволить изменение цвета кнопки, кажется, немного переборщило. Возможно, мне лучше просто создать пару тем или просто потерять цвет нажатого состояния, если люди действительно хотят изменить цвет кнопки. Если у кого-то есть более простое решение, тогда я все уши и еще раз спасибо всем за то, что посмотрел. – 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> 

Edit: если вы хотите взять цвет с пользователем, это может работать, если состояние селектор будет перекрытая этим кодом:

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.Then:

`StateListDrawable ret = (StateListDrawable) res.getDrawable(R.drawable.btn_selector); 
    ret.addState(new int[] {}, new ColorDrawable(your_desire_color)); 
    mybutton.setBackgroundDrawable(ret);` 
Смежные вопросы