1. 程式人生 > >setOnTouchEvent 設定返回值為true 和 false的區別

setOnTouchEvent 設定返回值為true 和 false的區別

View 類的 setOnTouchListener(OnTouchListener l)事件監聽,在構造 OnTouchListener 物件時需要重寫 onTouch(…)方法,這個方法的返回值是布林型別,

剛開始我按預設給定的返回值 false執行,發現只能監聽到這個 view 的“按下”事件,“移動”和“擡起”都不能夠監聽到;於是把返回值改為了 true,就都監聽到了。

但是隨後又遇到了一個問題,那就是:點選其他元件後,再點選這個 view 的時候獲取不到焦點!也就是click事件不響應了。我猜想一定是受到了 onTouch 方法的影響,查資料發現:

  設為true 和 false的效果是有區別的:

  setOnTouchListener 單獨使用的時候返回值需要為true,這樣才能保證移動的時候能後獲取相應的監聽,而非一次監聽(即每次只有一個按下的事件)
  setOnTouchListener 和 setOnClickListener 同時使用時,onTouch 的返回值要設為 false,這樣既可以保證按下移動擡起事件可以被監聽,並且點選事件也會被監聽。於是,我又對這個 view 設定了setOnClickListener(雖然重寫的方法體中什麼也沒寫),並將onTouch 的返回值要設為 了false,結果就 既監聽到了Touch 也能監聽到 click 事件了,可以重獲焦點了!

tv.setOnTouchListener(new OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub

switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
  ...   
  break;


  case MotionEvent.ACTION_MOVE:

  ...
  break;


  case MotionEvent.ACTION_UP:     

  ...
  break;
}

return false; // (或return  true)

}
});