Ý tưởng là tạo ra một Runnable
nhấ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ừ Cell
trong ListView
đến Activity
vớ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;
}
ClickDelegate
là 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 Activity
hoặc cha mẹ View
nế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;
}
}
}