Пользовательский вид (кнопка), селектор фона не работает
У меня есть простая пользовательская кнопка:
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);
Я попробую. Работает отлично