2012-07-28 32 views
10

我在自定義視圖中檢測到長按有問題。長按Android

下面是與此相關的問題

final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
    public void onLongPress(MotionEvent e) { 
     Log.e("dbg_msg", "onLongPress"); 
    } 
}); 

public boolean onTouchEvent(MotionEvent event) { 
    return gestureDetector.onTouchEvent(event); 
}; 

代碼此代碼檢測每一個(短)點擊,只要按。

當我把這段代碼放在繼承自Activity的類中時,它就起作用了。

那麼爲什麼它不能在自定義視圖中工作?

+0

返回從真正的onTouchEvent固定這對我來說 – Manuel 2014-02-23 10:40:25

回答

23

所有這些代碼去把定製的視圖類:

public static int LONG_PRESS_TIME = 500; // Time in miliseconds 

final Handler _handler = new Handler(); 
Runnable _longPressed = new Runnable() { 
    public void run() { 
     Log.i("info","LongPress"); 
    } 
}; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch(event.getAction()){ 
    case MotionEvent.ACTION_DOWN: 
     _handler.postDelayed(_longPressed, LONG_PRESS_TIME); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     _handler.removeCallbacks(_longPressed); 
     break; 
    case MotionEvent.ACTION_UP: 
     _handler.removeCallbacks(_longPressed); 
     break; 
    } 
    return true; 
} 
+0

還應該調用MotionEvent.ACTION_CANCEL上的removeCallbacks。 – kasgoku 2014-08-22 14:10:11

+2

您應該刪除ACTION_MOVE,因爲它會取消處理程序。 – 2015-05-05 12:51:14

+1

工作正常... !!! – InsaneCat 2017-02-23 07:17:04

2

我不確定,但您的GestureDetector的構造函數已被棄用(here)。你可以嘗試其他需要上下文作爲第一個參數的嗎?

對不起,我是新的,所以我不能發表評論。

- 編輯 -

看來你使用其它監聽,這View.OnTouchListener有其他onTouch()方法。你能再試一次嗎?

- 編輯 -

下面是一個例子(爲我工作):

... 
mAnotherView.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return mGestureDetector.onTouchEvent(event); 
    } 
}); 

... 
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { 

    @Override 
    public void onLongPress(MotionEvent e) { 
     // do your tasks here 
    } 
}); 
+0

我已經試過了太,但它不起作用:( – 2012-07-28 14:59:59

+0

如何做到這一點,我不明白你? – 2012-07-28 15:33:32

+1

不客氣:-)我認爲你可以自己回答,幫助其他人閱讀你的問題。 – Anh3Saigon 2012-07-28 15:53:30

3

你上啓用GestureDetector長按?您可以使用適當的構造函數或通過調用setIsLongpressEnabled來啓用它。例如,你可以這樣做:

gestureDetector.setIsLongpressEnabled(true); 

在你的構造函數中。

+1

長按仍然不起作用 – 2012-07-28 15:33:58

+0

偶然它對我很有用。感謝+1對於 – 2014-08-26 06:05:26

0

它更好,我想..

public class Workflow extends View implements View.OnLongClickListener { 

public Workflow(Context context, DisplayFeatures d) { 
    super(context); 

    setLongClickable(true); 
    setOnLongClickListener(this); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    /* onTouchEvent should return super.onTouchEvent(event);, otherwise long click wouldn't be performed */ 
    return super.onTouchEvent(event); 
} 

@Override 
public boolean onLongClick(View v) { 
    Log.d("VIEW", "LONG CLICK PERFORMED!"); 
    return false; 
} 
}