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 ?
Réponses
Trop de publicités?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.
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.
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.
Essayez de surcharger et de renvoyer true à partir de onInterceptTouchEvent () et / ou de onTouchEvent () , qui consomment des événements tactiles sur le pager.