Долгое нажатие на 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;
}
}