长按Android

时间:2012-07-28 14:23:14

标签: 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继承的类中时,它可以工作。

那为什么它不能在自定义视图中工作?

4 个答案:

答案 0 :(得分:24)

所有这些代码都在您的自定义视图类中:

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;
}

答案 1 :(得分:4)

我不确定你的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
    }
});

答案 2 :(得分:4)

您是否在GestureDetector上启用了长按?您可以使用适当的构造函数或通过调用setIsLongpressEnabled来启用它。例如,你可以这样做:

gestureDetector.setIsLongpressEnabled(true);

在你的构造函数中。

答案 3 :(得分: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;
}
}