2014-11-06 4 views
0

У меня есть три Buttons. Я хочу, чтобы кнопка меняла цвет при нажатии, а затем, если я снова нажму кнопку, он вернется к цвету по умолчанию.Кнопка не изменит фон при нажатии

Проблема: если я нажму на первый, это изменит цвет. Однако, если я нажму на второй, он не изменит цвет. Но если я нажму на эту секунду Button, это дополнительное время изменит цвет. Кто-нибудь знает, почему второй Button не изменит цвет при первом нажатии?

Примечание: после отладки я заметил, что is_clicked установлен в 1 после того, как я нажму на первый Button. Поэтому, когда я нажимаю на второй Button, он думает, что он уже изменил цвет и установил его обратно по умолчанию. Кто-нибудь знает, как я могу правильно установить флаг is_clicked? Или есть что-то еще, что я должен делать?

int is_clicked = 0; 


public void ButtonOnClick(View v) { 

      switch (v.getId()) { 
       case R.id.button1: 
        if (is_clicked == 1){ 
         button_list.get(0).getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x00000000));; 
         is_clicked--; 
         break; 
        } 
        if (is_clicked == 0){ 
         button_list.get(0).getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0xFF00FF00)); 
         is_clicked++; 
         break; 
        } 
         break; 
       case R.id.button2: 
        if (is_clicked == 1){ 
         button_list.get(1).getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x00000000));; 
         is_clicked--; 
         break; 
        } 
        if (is_clicked == 0){ 
         button_list.get(1).getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0xFF00FF00)); 
         is_clicked++; 
         break; 
        } 
         break; 
       case R.id.button3: 
        if (is_clicked == 1){ 
         button_list.get(2).getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x00000000));; 
         is_clicked--; 
         break; 
        } 
        if (is_clicked == 0){ 
         button_list.get(2).getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0xFF00FF00)); 
         is_clicked++; 
         break; 
        } 
         break; 
       } 
      } 
+0

Тогда Есть три ИНТ is_clicked нравится btn1_clicked, btn2_clicked, btn3_clicked –

+0

гм, хорошее предложение. Однако в моей программе у меня на самом деле есть 50 кнопок. Поэтому я надеялся, что могу использовать один is_clicked для всех случаев. Я просто сократил его до трех кнопок для этого примера и простоты ... – user2456977

+2

Его плохая практика, чтобы установить такие цвета, почему вы не используете 'Selector' вместо этого, вы можете добиться этого всего на 2 или 3 строки кодов – Pedram

ответ

1

Пока я согласен с Pedram .... Согласно вашему запросу, вы используете теги в xml.

Поместите этот тег в каждой кнопке

 android:tag="0" 

В случае

String clicked= (String)btn1.getTag(); 
    If ("0".equals(clicked)) { 
    //set a color for your button 
     button1.setTag("1"); 
    } else { 
    //set a color for your button 
     button1.setTag("0"); 
    } 
1

Его только простая кнопка

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:drawable="@drawable/normal" android:state_enabled="true" android:state_focused="true"/> 
    <item android:drawable="@drawable/pressed" android:state_enabled="true" android:state_pressed="true"/> 
    <item android:drawable="@android:color/white"/> 

</selector> 

Установите в качестве фона вашего баттона

правок: Последний один по умолчанию, есть еще состояние также, как выбрать и отключить, попробуйте сыграть с ними, вы можете сделать много функций с помощью селекторов.

Это хорошая кнопка. с инсультом и отключенным состоянием.

<?xml version="1.0" encoding="utf-8" ?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" > 
    <shape> 
     <solid 
      android:color="#00aeef" /> 
     <stroke 
      android:width="1dp" 
      android:color="#0090bf" /> 
     <corners 
      android:radius="6dp" /> 
     <padding 
      android:left="10dp" 
      android:top="10dp" 
      android:right="10dp" 
      android:bottom="10dp" /> 
    </shape> 
<!--  #ef4444 #992f2f --> 
</item> 
    <item android:state_enabled="false"> 
     <shape> 
     <solid 
      android:color="#174574"/> 
     <stroke 
      android:width="1dp" 
      android:color="#12375D" /> 
     <corners 
      android:radius="6dp" /> 
     <padding 
      android:left="10dp" 
      android:top="10dp" 
      android:right="10dp" 
      android:bottom="10dp" /> 
    </shape> 
    </item> 
<!-- Default --> 
    <item> 
    <shape> 
     <gradient 
      android:startColor="#3399FF" 
      android:endColor="#2E8AE6" 
      android:angle="270" /> 
     <stroke 
      android:width="1dp" 
      android:color="#297CCF" /> 
     <corners 
      android:radius="6dp" /> 
     <padding 
      android:left="10dp" 
      android:top="10dp" 
      android:right="10dp" 
      android:bottom="10dp" /> 
    </shape> 
    </item> 
</selector> 
+0

Извините, я немного новичок в этом. В какую папку/файл я добавляю это? Создать новый xml-файл в drawable? или я добавляю это в layour xml, где я создал кнопки? – user2456977

+1

@ user2456977 поместите его в свою папку с выделением, если у вас ее нет, уже создайте новую, и вы также избавитесь от кода кода коммутатора, он просто работает через XML. – Pedram

+0

Мне пришлось выбрать ответ Индры, поскольку Индра ответил на него, используя мой текущий код. Однако я, вероятно, изменю свой код так, как вы предлагали. Но я дал вам хотя бы минимум: Спасибо большое! – user2456977

Смежные вопросы