Долгое нажатие на 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, он работает.

Итак, почему он не работает в пользовательском представлении?

Ответ 1

Весь этот код входит в ваш пользовательский класс просмотра:

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

Ответ 2

Включили ли вы длительные нажатия на свой GestureDetector? Вы можете включить его либо с помощью соответствующего конструктора, либо путем вызова setIsLongpressEnabled. Например, вы можете:

gestureDetector.setIsLongpressEnabled(true);

в вашем конструкторе.

Ответ 3

Я не уверен, но ваш конструктор GestureDetector устарел (здесь). Не могли бы вы попробовать другие, которым нужен контекст как первый параметр?

Жаль, что я новичок, поэтому я не могу оставлять комментарии.

- Отредактировано -

Кажется, вы использовали другого слушателя, этот 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
    }
});

Ответ 4

Это лучше, я думаю..

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