Die Idee ist es, eine Runnable
in Zukunft langen Klick für die Ausführung zu Diese Ausführung kann jedoch aufgrund eines Klicks oder einer Verschiebung abgebrochen werden.
Sie müssen auch wissen, wann ein langer Klick verbraucht wurde und wann er abgebrochen wird, weil sich der Finger zu stark bewegt hat. Wir verwenden initialTouchX
&initialTouchY
um zu überprüfen, ob der Benutzer einen quadratischen Bereich von 10 Pixel, 5 auf jeder Seite, verlässt.
Hier ist mein vollständiger Code zum Delegieren von Click & LongClick von Cell
in ListView
nach Activity
mit 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
ist ein interface
zum Senden von Klickereignissen an die Handlerklasse wie einActivity
public interface ClickDelegate {
boolean onItemClick(int position);
boolean onItemLongClick(int position);
}
Und alles, was Sie brauchen, ist, es in Ihrem Activity
oder einem Elternteil zu implementieren, View
wenn Sie das Verhalten delegieren müssen:
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;
}
}
}