3

I have simple custom button:

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;
      }
    });
      }
}

with selector

<?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>

set by

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

Background in "normal" state is fine. But other states don't work at all. What is strange - when I change

<com.blabla.myButton

to

<Button

selector works perfectly fine.

Any ideas?

Edit: I added commonConstructorCode().

4

3 回答 3

2

我复制了您的代码并使自定义按钮选择器正常工作,但设置:

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

根据android docs,public boolean onTouch(),

返回:如果侦听器已经消费了事件,则返回 true,否则返回 false。

因此,返回 true 表示您的方法已经使用了该事件,并且似乎停止了它对层次结构的渗透并触发选择器状态。

于 2013-05-08T20:14:28.673 回答
1

您可以尝试在自定义 xml 视图上进行设置。

android:focusable = "true" 

我有一个类似的问题,将 focusable 设置为 true 允许视图读取正确的状态并应用选择器。

于 2013-05-08T17:15:40.620 回答
0

在您的类的构造函数中,使用以下代码:

this.setBackgroundResource(drawable.button_selector);

我试试看。完美运行

于 2014-08-13T15:29:16.457 回答