3

私はシンプルなカスタムボタンを持っています:

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() を追加しました。

4

3 に答える 3

2

私はあなたのコードを複製し、カスタムボタンセレクターを機能させましたが、設定しました:

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

アンドロイドのドキュメントによると、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 に答える