Пользовательский вид (кнопка), селектор фона не работает

У меня есть простая пользовательская кнопка:

public class myButton extends Button {
    public myButton (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        commonConstructorCode();
    }


    public myButton (Context context, AttributeSet attrs) {
        super(context, attrs);
        commonConstructorCode();
    }

  public myButton (Context context) {
    super(context);
    commonConstructorCode();
  }

      private void commonConstructorCode() {
                this.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction(); 

                    if(action == MotionEvent.ACTION_DOWN) 
                    {
                      //Just to be sure that we removed all callbacks, 
                      // which should have occurred in the ACTION_UP
                      removeCallbacks(repeatClickWhileButtonHeldRunnable);

                      //Perform the default click action.
                      performClick();
                      //if(v.isEnabled()){
                      //Schedule the start of repetitions after a one half second delay.
                      postDelayed(repeatClickWhileButtonHeldRunnable, initialRepeatDelay);
                      //} else {
                        //  removeCallbacks(repeatClickWhileButtonHeldRunnable);
                      //}
                    }
                    else if(action == MotionEvent.ACTION_UP) {
                      //Cancel any repetition in progress.
                      removeCallbacks(repeatClickWhileButtonHeldRunnable);
                    }
                //Returning true here prevents performClick() from getting called 
                // in the usual manner, which would be redundant, given that we are 
                // already calling it above.
                return true;
      }
    });
      }
}

с селектором

<?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true"
           android:drawable="@drawable/button_pressed" /> <!-- pressed -->
     <item android:state_focused="true"
           android:drawable="@android:color/white" /> <!-- focused -->
     <item android:drawable="@drawable/button_standard" /> <!-- default -->
 </selector>

установить с помощью

<com.blabla.myButton
    ...
    background="@drawable/button_selector" />

Фон в "нормальном" состоянии в порядке. Но другие государства не работают вообще. Что странно - когда я меняюсь

<com.blabla.myButton

в

<Button

Селектор работает отлично.

Есть идеи?

Изменить: я добавил commonConstructorCode().

3 ответа

Решение

Я скопировал ваш код и получил работающий пользовательский селектор кнопок, но установив:

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // Blah blah blah....
            return false; // this was return true
        }
    });

Согласно документам Android, публичный логический onTouch(),

Возвращает: True, если слушатель использовал событие, в противном случае - false.

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

Вы можете попробовать установить это в пользовательском представлении XML.

android:focusable = "true" 

У меня была похожая проблема, и настройка focusable на true позволила представлению прочитать правильное состояние и применить селектор.

В конструкторе вашего класса используйте следующий код:

this.setBackgroundResource(drawable.button_selector);

Я попробую. Работает отлично

Другие вопросы по тегам