595 votes

Comment désactiver pagination en faisant glisser avec le doigt en ViewPager mais quand même pouvoir frapper à toute volée par programmation ?

J’ai ViewPager et en dessous, j’ai 10 boutons. En cliquant sur le bouton, par exemple #4, le pagineur affiche immédiatement page #4 par `` . Mais, je veux désactiver la pagination en faisant glisser avec le doigt horizontalement. Ainsi, l’échange se fait uniquement en cliquant sur les boutons. Alors, comment je peux désactiver le glisser avec le doigt ?

912voto

louielouie Points 5615

Vous avez besoin de sous-classe ViewPager. onTouchEvent a beaucoup de bonnes choses dans ce que vous ne voulez pas changer, comme en permettant à l'enfant de vues pour obtenir de touche. onInterceptTouchEvent est ce que vous voulez changer. Si vous regardez le code pour ViewPager, vous pourrez voir le commentaire:

    /*
     * This method JUST determines whether we want to intercept the motion.
     * If we return true, onMotionEvent will be called and we do the actual
     * scrolling there.
     */

Voici une solution complète:

Tout d'abord, ajoutez cette classe à votre dossier src:

package com.yourcompany;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class NonSwipeableViewPager extends ViewPager {

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

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        // Never allow swiping to switch between pages
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }
}

Ensuite, assurez-vous que l'utilisation de cette classe au lieu de l'ordinaire ViewPager, qui vous a probablement spécifié comme android.de soutien.v4.vue.ViewPager. Dans votre fichier de mise en page, vous aurez envie de le spécifier avec quelque chose comme:

<com.yourcompany.NonSwipeableViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

Cet exemple particulier est dans un LinearLayout et est destiné à prendre la totalité de l'écran, c'est pourquoi layout_weight est 1 et layout_height est 0dp.

478voto

Rajul Points 1189

L'extension plus générale de ViewPager serait le pari de créer un "SetPagingEnabled" méthode afin que nous puissions activer et de désactiver la pagination à la volée. Pour activer / désactiver le balayage, juste annuler deux méthodes: "onTouchEvent" et "onInterceptTouchEvent". Les deux renvoie "false" si la pagination a été désactivé.

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;
} }

Ensuite, sélectionnez ce au lieu de la builtin viewpager en XML

<mypackage.CustomViewPager 
android:id="@+id/myViewPager" 
android:layout_height="match_parent" 
android:layout_width="match_parent" />

Vous avez juste besoin d'appeler le "setPagingEnabled" la méthode du "faux" et les utilisateurs ne seront pas en mesure de passer à la pagination.

118voto

Wayne Points 1897

Le moyen le plus simple est de setOnTouchListener et retourner la valeur true pour ViewPager.

59voto

Pietro Points 101

Mieux vaut le déclarer styleable, ainsi vous pouvez changer sa propriété de xml:

 private boolean swipeable;

public MyViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
    try {
        swipeable = a.getBoolean(R.styleable.MyViewPager_swipeable, true);
    } finally {
        a.recycle();
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return swipeable ? super.onInterceptTouchEvent(event) : false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return swipeable ? super.onTouchEvent(event) : false;
}
 

Et dans vos valeurs / attr.xml:

 <declare-styleable name="MyViewPager">
  <attr name="swipeable" format="boolean" />
</declare-styleable>
 

afin que vous puissiez l'utiliser dans votre mise en page xml:

 <mypackage.MyViewPager
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:swipeable="false" />
 

Bien sûr, vous pouvez toujours avoir une propriété get / set.

4voto

AdamK Points 1629

Essayez de surcharger et de renvoyer true à partir de onInterceptTouchEvent () et / ou de onTouchEvent () , qui consomment des événements tactiles sur le pager.

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