155 votes

Est-il possible de désactiver le défilement sur un ViewPager ?

J'ai un ViewPager qui instancie un View . J'aimerais désactiver momentanément le défilement du viewpager et des boutons enfant pendant qu'un résultat de recherche est renvoyé à la vue. J'ai appelé viewPager.setEnabled(false) mais cela ne le désactive pas.

Quelqu'un a une idée ?

379voto

slayton Points 13049

Une solution simple est de créer votre propre sous-classe de ViewPager qui a un private boolean drapeau, isPagingEnabled . Ensuite, remplacez le onTouchEvent y onInterceptTouchEvent méthodes. Si isPagingEnabled est égal à vrai, l'appel de la super sinon return .

public class CustomViewPager extends ViewPager {

    private boolean isPagingEnabled = true;

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onInterceptTouchEvent(event);
    }

    public void setPagingEnabled(boolean b) {
        this.isPagingEnabled = b;
    }
}

Alors dans votre Layout.XML remplace tout fichier <com.android.support.V4.ViewPager> tags avec <com.yourpackage.CustomViewPager> tags.

Ce code a été adapté de ce qui suit article de blog .

2 votes

Excellente solution, qui fonctionne bien. Si vous voulez arrêter de balayer comme un singe, vous pouvez surcharger un OnPageChangeListener avec @Override public void onPageScrollStateChanged(final int state) { switch (state) { case ViewPager.SCROLL_STATE_SETTLING : mPager.setPagingEnabled(false) ; break ; case ViewPager.SCROLL_STATE_IDLE : mPager.setPagingEnabled(true) ; break ; } // noop } }. // noop }

13 votes

P.S : Dans le XML, utilisez <votrepkgname.CustomViewPager... au lieu de <com.Android,support.v4.ViewPager...

0 votes

Pour ajouter une autre solution similaire, vous pouvez utiliser la bibliothèque appelée "JazzyViewPager" : github.com/jfeinstein10/JazzyViewPager et appelez simplement setPagingEnabled(boolean).

37voto

Akhil Sekharan Points 6018

Il existe une solution simple pour cela :

Lorsque vous voulez désactiver le défilement du viewpager alors :

mViewPager.setOnTouchListener(new OnTouchListener() {

   public boolean onTouch(View arg0, MotionEvent arg1) {
      return true;
   }
}); 

Et quand vous voudrez le réactiver alors :

mViewPager.setOnTouchListener(null);

Cela fera l'affaire.

52 votes

Presque, mais pas tout à fait. Le toucher est toujours possible, ce qui vous permet de déplacer les pages en effectuant de nombreux petits glissements.

0 votes

@Akhil Sekharan J'ai été confronté au même problème que Flynny en utilisant cette réponse mais heureusement, je ne sais pas comment cette erreur a soudainement disparu :) et a fonctionné comme un charme ! !!

0 votes

Vous pouvez faire le beaucoup de petits swipes ainsi vous devez toujours plus public boolean onInterceptTouchEvent(MotionEvent event) { rouler comme par la réponse de slatons

29voto

rekire Points 16519

Voici ma variante légère de la réponse de Slayton :

public class DeactivatableViewPager extends ViewPager {
    public DeactivatableViewPager(Context context) {
        super(context);
    }

    public DeactivatableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return !isEnabled() || super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return isEnabled() && super.onInterceptTouchEvent(event);
    }
}

Avec mon code vous pouvez désactiver la pagination avec setEnable() .

0 votes

Remplacement de onInterceptTouchEvent() empêchera les vues enfant de recevoir des données. Dans la plupart des cas, il s'agit no le comportement souhaité.

20voto

Yessy Points 249

J'ai trouvé une solution simple.

//disable swiping
mViewPager.beginFakeDrag();

//enable swiping
mViewPager.endFakeDrag();

0 votes

C'est tout le code que vous avez utilisé ? Cela ne fonctionne pas pour moi.

19 votes

Ça ne marche pas pour moi. Je peux quand même faire plein de petits glissements.

0 votes

Ce code n'est pas correct car il défile très lentement comme une vue suspendue.

18voto

Piyush Johnson Points 61

Dans mon cas d'utilisation de ViewPager 2 alpha 2 le snippet ci-dessous fonctionne

viewPager.isUserInputEnabled = false

Possibilité de désactiver l'entrée utilisateur (setUserInputEnabled, isUserInputEnabled)

se référer à ce document pour plus de changements dans viewpager2 1.0.0-alpha02

Quelques modifications ont également été apportées à la dernière version ViewPager 2 alpha 4.

les attributs orientation et isUserScrollable ne font plus partie de SavedState

se référer à ce document pour plus de changements dans viewpager2#1.0.0-alpha04

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X