J'observe un comportement très étrange dans ListView avec la gestion de MotionEvent. J'ai sous-classé ListView afin d'ajouter des journaux. Voici ma sous-classe.Android - flux étrange de MotionEvent dans listview
public class MyListView extends ListView{
public MyListView(Context context) {
this(context, null);
}
public MyListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
boolean retVal = super.dispatchTouchEvent(ev);
System.out.println("MyListview.dispatchTouchEvent :"+ev.getActionMasked()+" <<>> "+retVal);
return retVal;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean retVal = super.onInterceptTouchEvent(ev);
System.out.println("MyListview.onInterceptTouchEvent :"+ev.getActionMasked()+" <<>> "+retVal);
return retVal;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
boolean retVal = super.onTouchEvent(ev);
System.out.println("MyListview.onTouchEvent :"+ev.getActionMasked()+" <<>> "+retVal);
return retVal;
}
}
et, quand je jette sur cette liste, je reçois le journal en logcat suivant.
12-26 12: 38: 32,347: I/System.out (20725): MyListview.onInterceptTouchEvent: 0 < < >> faux 12 au 26 décembre: 38: 32,348: I/System.out (20725): MyListview.onTouchEvent: 0 < < >> vrai 26.12 12: 38: 32,348: I/System.out (20725): MyListview.dispatchTouchEvent: 0 < < >> vrai 26.12 12:38 : 32.388: I/System.out (20725): MyListview.onTouchEvent: 2 < < >> true 12-26 12: 38: 32.388: I/System.out (20725): MyListview.dispatchTouchEvent: 2 < < >> true 12-26 12: 38: 32.405: I/System.out (20725): MyListview.onTouchEvent: 2 < < >> true 12-26 12: 38: 32.405: I/System.out (20725): MyListview.dispatchTouchEvent: 2 < < >> true 12-26 12: 38: 32,422: I/System.out (20725): MyListview.onTouchEvent: 2 < < >> vrai 26.12 12:38: 32,422: I/System.out (20725): MyListview.dispatchTouchEvent: 2 < < >> vrai décembre 12 à 26: 38: 32,439: I/System.out (20725): MyListview.onTouchEvent: 2 < < >> vrai 12-26 12: 38: 32.439: I/System.out (20725): MyListview.dispatc hTouchEvénement: 2 < < >> true 12-26 12: 38: 32.455: I/System.out (20725): MyListview.onTouchEvent: 2 < < >> true 12-26 12: 38: 32.455: I/Système .out (20725): MyListview.dispatchTouchEvent: 2 < < >> true 12-26 12: 38: 32,473: I/System.out (20725): MyListview.onTouchEvent: 2 < < >> vrai 26.12 12: 38: 32.473: I/System.out (20725): MyListview.dispatchTouchEvent: 2 < < >> true 12-26 12: 38: 32.484: I/System.out (20725): MyListview.onTouchEvent: 2 < < >> true 12-26 12: 38: 32.484: I/System.out (20725): MyListview.dispatchTouchEvent: 2 < < >> vrai 26.12 12: 38: 32,484: I/System.out (20725): MyListview.onTouchEvent: 1 < < >> vrai 12 au 26 décembre: 38: 32,484: I/System.out (20725): MyListview.dispatchTouchEvent: 1 < < >> vrai
Je suis perplexe les observations suivantes:
Pour ACTION_DOWN (code 0),
onInterceptTouchEvent
renvoie "false", toujoursonTouchEvent
est appelée, même pour ACTION_DOWN (code 0). Est-ce queonTouchEvent
n'est pas censé être appelé seulement si je retourne vrai deonInterceptTouchEvent
?Comme je sais, tant queonInterceptTouchEvent
retourne faux, je devrais continuer à obtenir des événements dansonInterceptTouchEvent
, mais ce n'est pas le cas! (Je ne pense pas vue enfant est en train de voler des événements parce que tous les événements suivants sont livrés enMyListView's
onTouchEvent
lui-même.)
Quelqu'un peut-il me aider à comprendre pourquoi je reçois ces journaux? Merci.
Merci pour la réponse. Cependant, je suis passé à autre chose et je n'ai donc pas pu tester ou vérifier votre réponse. –