2015-02-08 1 views
3

У меня есть ряд кнопок, и я устанавливаю их селектора для фона и текста программно. Причина, по которой я хочу сделать это программно, заключается в том, что у меня есть набор тем, которые пользователь может выбрать, и в зависимости от выбранной темы я хочу изменить селектор кнопки.set Selector for Button Программные проблемы

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

Это похоже на все остальные темы. У меня есть отдельные XML-файлы для всех тем. Селектор для изменения цвета текста работает нормально. Проблема заключается в том, что кнопка выбора фона для кнопки.

selector_background_blue.xml

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

    <item android:drawable="@android:color/white" android:state_pressed="true"/> 
    <item android:drawable="@color/blue_500"/> 

</selector> 

color_selector.xml

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

    <item android:state_pressed="true" android:color="@color/blue_500"/> 
    <item android:color="@android:color/white"/> 

</selector> 

У меня есть класс, который возвращает Drawable (селектор) в зависимости от выбранной темы. Я получаю селектор следующим образом:

public Drawable getButtonBackgrounds(String theme) { 
    Drawable drawable = null; 

    if (theme.equalsIgnoreCase(Const.Theme.BLUE)) 
     drawable = context.getResources().getDrawable(
       R.drawable.selector_background_blue); 

    return drawable; 
} 

Я устанавливаю этот селектор для фона кнопки, как показано ниже:

private void setButtonBackgrounds(Drawable buttonDrawable) { 
int sdk = android.os.Build.VERSION.SDK_INT; 

     if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { 
      btnA.setBackgroundDrawable(buttonDrawable); 
      btnT.setBackgroundDrawable(buttonDrawable); 
      ..... 
      ..... 
      btnVoice.setBackgroundDrawable(buttonDrawable); 
     } else { 
      btnA.setBackground(buttonDrawable); 
      btnT.setBackground(buttonDrawable); 
      ..... 
      ..... 
      btnVoice.setBackground(buttonDrawable); 
     } 
} 

кнопки он xml:

<Button 
    android:id="@+id/btnT" 
    android:layout_width="0dip" 
    android:layout_height="match_parent" 
    android:layout_weight="0.20" 
    android:background="?android:attr/selectableItemBackground" 
    android:text="@string/button_t" 
    android:textSize="22sp" /> 
XML

Всего Роу:

<LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" > 

      <Button 
       android:id="@+id/btnA" 
       android:layout_width="0dip" 
       android:layout_height="match_parent" 
       android:layout_weight="0.20" 
       android:background="?android:attr/selectableItemBackground" 
       android:text="@string/arithmetic_symbol" 
       android:textSize="16sp" /> 

      <Button 
       android:id="@+id/btnT" 
       android:layout_width="0dip" 
       android:layout_height="match_parent" 
       android:layout_weight="0.20" 
       android:background="?android:attr/selectableItemBackground" 
       android:text="@string/trigonometric_symbol" 
       android:textSize="16sp" /> 

      <Button 
       android:id="@+id/btnN" 
       android:layout_width="0dip" 
       android:layout_height="match_parent" 
       android:layout_weight="0.20" 
       android:background="?android:attr/selectableItemBackground" 
       android:text="@string/voice_calculator_symbol" 
       android:textSize="16sp" 
       android:visibility="gone" /> 

      <ImageButton 
       android:id="@+id/btnVC" 
       android:layout_width="0dip" 
       android:layout_height="match_parent" 
       android:layout_weight="0.20" 
       android:background="?android:attr/selectableItemBackground" 
       android:contentDescription="@string/empty" 
       android:src="@drawable/ic_keyboard_voice_black" 
       android:text="" /> 

      <Button 
       android:id="@+id/btnC" 
       android:layout_width="0dip" 
       android:layout_height="match_parent" 
       android:layout_weight="0.20" 
       android:background="?android:attr/selectableItemBackground" 
       android:text="@string/button_c" 
       android:textSize="16sp" /> 

      <Button 
       android:id="@+id/btnD" 
       android:layout_width="0dip" 
       android:layout_height="match_parent" 
       android:layout_weight="0.20" 
       android:background="?android:attr/selectableItemBackground" 
       android:text="@string/button_del" 
       android:textSize="16sp" /> 
     </LinearLayout> 

Это то же самое для всех кнопок в строке.

Выбираемый комплект устанавливается только на нагрузке. См. Изображение ниже.

enter image description here

Проблема заключается в том, когда я нажимаю на кнопки (напр., А), прилегающая ImageButton (микрофон) также меняет свое состояние. Пожалуйста, посмотрите на изображение ниже:

enter image description here enter image description here enter image description here enter image description here

Почему это происходит? Может кто-то помочь мне с этим. Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация.

+0

Что такое класс контейнеров для этих кнопок? Я имею в виду, они содержатся в LinearLayout, FrameLayout или что-то еще? У вас есть слушатели, прикрепленные к этим кнопкам? – aga

+0

Они находятся внутри линейного макета .. Будет обновлять вопрос с XML за 1 час –

+0

@aga, обновленный вопрос с xml. У каждой кнопки есть привязанный onClickListener. –

ответ

21

Я думаю, что вы испытываете мутировать о связанном вопросе (пожалуйста, см here, это крайне полезное)

Вам нужно позвонить mutate() на вашем Drawable, прежде чем assingning его к View если Yout дон» т хотят разделить общее состояние через различные инстанции:

Drawable buttonDrawable = context.getResources().getDrawable(R.drawable.btn); 
buttonDrawable.mutate() 
btnA.setBackgroundDrawable(buttonDrawable); 

в своем коде вы используете один и тот же Drawable для более одного View, поэтому вам необходимо принять описанный выше подход, чтобы избежать совместного использования государством.

+0

попробует и вернется к вам ... –

+0

Человек, которого вы спасли мою жизнь .. Кажется, что нужно работать. +1 до тех пор, пока я не проверю приложение и не назову вам награду. –

+0

@ VamsiChalla рада это слышать. Сообщите нам, если у вас есть другие проблемы. – bonnyz

1

Чувак Вы должны установить переключатель From The XML File смотрите ниже:

<Button 
android:id="@+id/btnT" 
android:layout_width="0dip" 
android:layout_height="match_parent" 
android:layout_weight="0.20" 
android:background="@drawable/button_selector" 
android:text="@string/button_t" 
android:textSize="22sp" /> 

Здесь свойство android:background="@drawable/you_drawable_selector" где вы должны установить селектор.

Надеюсь, я помог.

+0

Я знаю, но мои селекторы меняются в зависимости от темы, которую выбирает пользователь, и поэтому я настраиваю селектора программно. –

+0

Взгляните на этот метод: private void setButtonBackgrounds (Drawable buttonDrawable) –

+0

Да, это то, что я пытаюсь выяснить. –