1

У меня есть простой пользовательской кнопки:режим просмотра (кнопка) селектор фона не работает

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().

+0

хорошо, это странно. Я попытался сделать пользовательскую кнопку с вашим XML-файлом селектора, и все в порядке. – user2340612

+0

Я протестировал его на устройстве с Android 4.2 и 2.3.7 - и с тем же, и с неправильным результатом. – androfan

+0

Я добавляю фон селектора, используя стиль. Но настройка непосредственно не работает. – androfan

ответ

1

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

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

Согласно андроид документов, общественное логическому onTouch(),

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

Таким образом, возврат истины указывает на то, что ваш метод поглотил событие и, по-видимому, остановил его, перевернув иерархию и вызвав состояния селектора.

+0

Отлично! Я также удалил функцию performClick(), чтобы предотвратить двойной щелчок, вызванный возвратом false. Спасибо ;-). – androfan

+0

Счастливые помочь. Это подслушивало меня, поэтому мне пришлось сесть и попробовать; – speedynomads

1

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

android:focusable = "true" 

У меня была аналогичная проблема и установка фокусируемый истина позволила вид прочитать правильное состояние и применить селектор.

+0

К сожалению, не помогло. – androfan

+0

Странно, что обычный тег кнопки работает, а пользовательский - нет. могучий странный. – speedynomads

+0

Просто подумайте, вы можете попробовать добавить super.onTouchEvent (event); на верхнюю часть вашего onTouch. Может быть, что-то не получает класс Button, из которого вы расширяетесь, что ему нужно изменить состояние селектора. – speedynomads

0

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

this.setBackgroundResource(drawable.button_selector); 

я попробовать. Прекрасно работает