2011-09-12 37 views
8

我有一個自定義視圖,就像一個按鈕。我想在用戶按下時更改背景,當用戶將手指移動到外部或釋放背景時將背景恢復爲原始,並且我還想處理onClick/onLongClick事件。問題是onTouch要求我爲ACTION_DOWN返回true,否則它不會發送給我ACTION_UP事件。但是,如果我返回true,那麼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或通過 setOnTouchListener設定的某個特定 View.OnTouchListener

, 你肯定很關心這一點。

所以你的代碼應該是這樣的:

 
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; 
} 
相關問題