Android SimpleOnGestureListener.onFling obtenant un MotionEvent nul
Je suis en train d'essayer de détecter une aventure d'un événement sur une simple application Android, mais la première MotionEvent
argument est toujours null. Pourquoi le onFling méthode appelée avec un argument null? Le Android documentation dit qu'elle est appelée lorsqu'un fling événement se produit avec l'initiale en bas MotionEvent et la mise en correspondance des MotionEvent.
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//e1 always == null, return early a null reference exception
if (e1 == null) {
return false;
}
if (e1.getY() - e2.getY() > 120) {
handleFlingEvent();
return true;
}
return false;
}
}
L'Activité principale a cette méthode onTouchEvent:
GestureDetector flingDetector = new GestureDetector(new MyGestureDetector());
@Override
public boolean onTouchEvent(MotionEvent event) {
if (flingDetector.onTouchEvent(event)) {
return true;
}
return super.onTouchEvent(event);
}
source d'informationauteur mcrumley
Vous devez vous connecter pour publier un commentaire.
J'ai le même problème. Cela se produit lorsque la GestureDetector et la onFling méthode a été dans une classe de vue personnalisée, qui est une partie de l'activité de l'INTERFACE utilisateur. Après une série de tests, j'ai trouvé que seulement l'Activité principale de détecter le mouvement de balayage. J'ai donc résoudre le problème par les remplacer dans l'activité. Mais je n'ai pas trouver la cause de ce problème.
J'ai d'abord rencontré ce problème avec Android 4.0 que mon code fonctionne très bien dans toutes les versions antérieures. Après avoir pris un repère de la des suggestions ici, j'ai trouvé une solution facile est de simplement garder une trace de la onDown de l'événement et de l'utiliser à la place de la première param de onFling dans le cas où il arrive à être null.
J'ai eu le même problème avec vue personnalisée et OnGestureListener onFling. Trouvé ceci:
Provenant de http://developer.android.com/training/custom-views/making-interactive.html
En vue personnalisée groupe classe, vous devez remplacer les 2 méthodes:
onInterceptTouchEvent
etonTouchEvent
. Après cela, vous devez appelerGestureDetector.onTouchEvent()
dans les deux méthodes. ÉvénementACTION_DOWN
est passé àonInterceptTouchEvent
seulement.J'ai eu 3 boutons en horizonal linéaire de la mise en page et cette mise en page, à son tour entouré par
horizontalscrollview
.Puis j'ai mis
simplegesturelistener
sur lehorizontalscrollview
et obtenu la même erreur que ci-dessus. Puis, j'ai aussi missimplegesturelistener
pour tous les boutons dans la mise en page et cela a fonctionné.Je pense que le onDown événement a été repris par la scrollview, donc on ne peut pas obtenir de l'événement dans l'activité. Si vous avez personnalisé un ScrollView et remplacer le dispatchTouchEvent() et onTouchEvent(), le problème sera résolu.
Activité:
MySimpleGestureListener:
Enfin, MyScrollView
Espérons que cette aide.