web-dev-qa-db-fra.com

ViewPager intercepte tous les événements onTouch de l'axe x. Comment désactiver?

Portée

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.

Problème

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.

Question

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!

33
Oleksii Malovanyi

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;
    }
}
42
alex.zherdev

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);
    }
}
19
Kuffs

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!

0
GeekLei