2011-09-12 28 views
8

私はボタンのように動作するカスタムビューを持っています。私はバックグラウンドをユーザーが押したときに変更したい、ユーザーが指を外側に動かしたときに背景を元に戻す、またはそれを解放する、そしてまたonClick/onLongClickイベントを処理したい。問題は、onTouchはACTION_DOWNに対してtrueを返す必要があるか、ACTION_UPイベントを送信しないことです。しかし、私が真を返すと、onClickリスナーは動作しません。onClickとonLongClickのAndroid onTouch

私はonTouchでfalseを返してonClickに登録することで解決したと思っていました。何とかうまくいきましたが、ドキュメントとはちょっと違っていました。私はちょうどボタンを長押しすることができないというメッセージをユーザーから受け取ったので、ここで何が間違っているのだろうかと思っています。現在のコードの

パート:

public boolean onTouch(View v, MotionEvent evt) 
{ 
    switch (evt.getAction()) 
    { 
    case MotionEvent.ACTION_DOWN: 
    { 
     setSelection(true); // it just change the background 
     break; 
    } 

    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_OUTSIDE: 
    { 
     setSelection(false); // it just change the background 
     break; 
    } 
    } 

    return false; 
} 

public void onClick(View v) 
{ 
    // some other code here 
} 

public boolean onLongClick(View view) 
    { 
    // just showing a Toast here 
    return false; 
    } 


// somewhere else in code 
setOnTouchListener(this); 
setOnClickListener(this); 
setOnLongClickListener(this); 

は、どのように私は彼らが正常に一緒に動作するのですか?事前

答えて

10

onClick & onLongClick

おかげで、実際にView.onTouchEventから派遣されます。

View.onTouchEventを無効にするか、View.OnTouchListenersetOnTouchListener、 経由で送信する場合は、それを気にする必要があります。

ので、あなたのコードのようなものでなければなりません:

 
public boolean onTouch(View v, MotionEvent evt) 
{ 
    // to dispatch click/long click event, 
    // you must pass the event to it's default callback View.onTouchEvent 
    boolean defaultResult = v.onTouchEvent(evt); 

    switch (evt.getAction()) 
    { 
    case MotionEvent.ACTION_DOWN: 
    { 
     setSelection(true); // just changing the background 
     break; 
    } 
    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_OUTSIDE: 
    { 
     setSelection(false); // just changing the background 
     break; 
    } 
    default: 
     return defaultResult; 
    } 

    // if you reach here, you have consumed the event 
    return true; 
} 
関連する問題