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 ?

17voto

M. Marmor Points 91

Je propose un autre moyen de résoudre ce problème. L'idée est d'envelopper votre viewPager par un scrollView, de sorte que lorsque ce scrollView est non défilable, votre viewPager est non défilable aussi.

Voici ma maquette XML :

        <HorizontalScrollView
            android:id="@+id/horizontalScrollView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true" >

            <android.support.v4.view.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="wrap_content"
                android:layout_height="match_parent" />

        </HorizontalScrollView>

Aucun code n'est nécessaire.

Cela fonctionne bien pour moi.

1 votes

Parmi toutes ces réponses, je trouve que celle-ci est simple et fonctionne très bien !

0 votes

OK ... MAIS lorsque vous avez une carte comme l'un des fragments du ViewPager, alors ... il y a un problème.

0 votes

@ekashking Vous pouvez déplacer le focus sur votre fragment, donc le défilement affectera votre carte.

5voto

Isaias Carrera Points 195

Pour désactiver le balayage

 mViewPager.beginFakeDrag();

Pour activer le balayage

 mViewPager.endFakeDrag();

2 votes

Le défilement est toujours possible, mais il n'est plus fluide. En fait, cela ne fait qu'empirer la qualité sans résoudre le problème.

1 votes

Réponse dupliquée

3voto

La meilleure solution qui a fonctionné pour moi est la suivante :

public class DeactivatedViewPager extends ViewPager {

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

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

    @Override
    public boolean canScrollHorizontally(int direction) {
        return false;
    }
}

Après cela, le défilement sera désactivé par le toucher et vous pourrez toujours utiliser la fonction setCurrentItem pour changer de page.

0 votes

Je ne sais pas pourquoi, mais ça n'a tout simplement pas marché. Le défilement se produit toujours.

1 votes

El canScrollHorizontally() n'a aucun effet dans le scénario actuel. Elle n'est même pas appelée lorsque le glissement se produit.

3voto

Pasi Matalamäki Points 1412

Voici une réponse en Kotlin et androidX

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager

class DeactivatedViewPager @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null
) : ViewPager(context, attrs) {

    var isPagingEnabled = true

    override fun onTouchEvent(ev: MotionEvent?): Boolean {
        return isPagingEnabled && super.onTouchEvent(ev)
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        return isPagingEnabled && super.onInterceptTouchEvent(ev)
    }
}

2voto

godbye Points 144

Que pensez-vous de ceci :
J'ai utilisé CustomViewPager
et ensuite, surcharger la méthode scrollTo
J'ai vérifié le mouvement en faisant beaucoup de petits balayages, il ne défile pas vers d'autres pages.

public class CustomViewPager extends ViewPager {

    private boolean enabled;

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = true;
    }

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

        return false;
    }

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

        return false;
    }

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

    @Override
    public void scrollTo(int x, int y) {
       if(enabled) {
          super.scrollTo(x, y);
       }
    }
}

0 votes

J'avais le problème que le viewpager faisait toujours des petits mouvements, mais en surchargeant View.scrollTo(int x, int y) a résolu ce problème pour moi. Merci

0 votes

Il provoque un comportement étrange dans certains cas. Comme aller dans le vide et ne laisser qu'une page blanche '-'.

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