Ý tưởng là tạo ra một Runnablenhấp chuột dài để thực thi trong tương lai, nhưng thực thi này có thể bị hủy do nhấp chuột hoặc di chuyển.
Bạn cũng cần biết, khi nào thì nhấp chuột dài được sử dụng và khi nào thì nó bị hủy do ngón tay di chuyển quá nhiều. Chúng tôi sử dụng initialTouchX& initialTouchYđể kiểm tra xem người dùng có thoát khỏi vùng hình vuông 10 pixel, mỗi cạnh 5 pixel hay không.
Đây là mã hoàn chỉnh của tôi cho ủy Click & LongClick từ Celltrong ListViewđến Activityvới OnTouchListener:
ClickDelegate delegate;
boolean goneFlag = false;
float initialTouchX;
float initialTouchY;
final Handler handler = new Handler();
Runnable mLongPressed = new Runnable() {
public void run() {
Log.i("TOUCH_EVENT", "Long press!");
if (delegate != null) {
goneFlag = delegate.onItemLongClick(index);
} else {
goneFlag = true;
}
}
};
@OnTouch({R.id.layout})
public boolean onTouch (View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
handler.postDelayed(mLongPressed, ViewConfiguration.getLongPressTimeout());
initialTouchX = motionEvent.getRawX();
initialTouchY = motionEvent.getRawY();
return true;
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_CANCEL:
if (Math.abs(motionEvent.getRawX() - initialTouchX) > 5 || Math.abs(motionEvent.getRawY() - initialTouchY) > 5) {
handler.removeCallbacks(mLongPressed);
return true;
}
return false;
case MotionEvent.ACTION_UP:
handler.removeCallbacks(mLongPressed);
if (goneFlag || Math.abs(motionEvent.getRawX() - initialTouchX) > 5 || Math.abs(motionEvent.getRawY() - initialTouchY) > 5) {
goneFlag = false;
return true;
}
break;
}
Log.i("TOUCH_EVENT", "Short press!");
if (delegate != null) {
if (delegate.onItemClick(index)) {
return false;
}
}
return false;
}
ClickDelegatelà một interfaceđể gửi các sự kiện nhấp chuột đến lớp trình xử lý nhưActivity
public interface ClickDelegate {
boolean onItemClick(int position);
boolean onItemLongClick(int position);
}
Và tất cả những gì bạn cần là triển khai nó trong của bạn Activityhoặc cha mẹ Viewnếu bạn cần ủy quyền hành vi:
public class MyActivity extends Activity implements ClickDelegate {
SomeArrayAdapter.delegate = this;
SomeViewHolder.delegate = this;
SomeCustomView.delegate = this;
@Override
public boolean onItemClick(int position) {
Object obj = list.get(position);
if (obj) {
return true;
} else {
return false;
}
}
@Override
public boolean onItemLongClick(int position) {
Object obj = list.get(position);
if (obj) {
return true;
} else {
return false;
}
}
}