Il y a un viseur de deux fragments. L'un de ces fragments a une disposition qui écoute les changements onTouch sur l'axe X.
La disposition n'obtient pas presque tous les événements Action.Move lorsque vous touchez et faites glisser le long de l'axe X. Il semble que le Viewpager ait un onInterceptTouchEvent qui retourne vrai.
Est-il réel de remplacer le comportement de Viewpager pour que cela fonctionne avec ma mise en page? La situation idéale est donc que la mise en page intercepte tous les événements onTouch dessus et que Viewpager gère le reste des événements onTouch. Merci!
Vous avez raison, je crois que chaque conteneur de défilement intercepte les événements tactiles, mais vous pouvez l'empêcher. Vous pouvez mettre un écouteur tactile sur votre mise en page:
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
pager.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
pager.requestDisallowInterceptTouchEvent(false);
break;
}
}
Situation similaire (mais sans utiliser un ViewPager), mettant cela dans la vue qui avait besoin de l'événement tactile a fonctionné pour moi. Ajoutez des chèques pour MotionEvents autres que ACTION_MOVE
si applicable à votre cas d'utilisation.
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
this.getParent().requestDisallowInterceptTouchEvent(true);
return true;
} else {
return super.onTouchEvent(event);
}
}
neutrino avait raison!
getParent().requestDisallowInterceptTouchEvent(true);
une fois que le viseur accède à l'interception touchEvent, la vue enfant qu'il contient peut obtenir l'événement. entrez la description de l'image ici
J'utilise un FrameLayout dans le Viewpager pour obtenir l'effet DrawerLayout (j'ai besoin qu'il ne corresponde pas à la hauteur de l'écran, donc je ne peux pas utiliser le tiroir ou le tiroir de navigation).
Ça aide vraiment!