Vous devez sous-classer ViewPager. onTouchEventcontient beaucoup de bonnes choses que vous ne voulez pas changer, comme autoriser les vues enfants à toucher. onInterceptTouchEventc'est ce que vous voulez changer. Si vous regardez le code pour ViewPager, vous verrez 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 srcdossier:
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;
public class NonSwipeableViewPager extends ViewPager {
public NonSwipeableViewPager(Context context) {
super(context);
setMyScroller();
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
setMyScroller();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
//down one is added for smooth scrolling
private void setMyScroller() {
try {
Class<?> viewpager = ViewPager.class;
Field scroller = viewpager.getDeclaredField("mScroller");
scroller.setAccessible(true);
scroller.set(this, new MyScroller(getContext()));
} catch (Exception e) {
e.printStackTrace();
}
}
public class MyScroller extends Scroller {
public MyScroller(Context context) {
super(context, new DecelerateInterpolator());
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
}
}
}
Ensuite, assurez-vous d'utiliser cette classe au lieu de la régulière ViewPager, que vous avez probablement spécifiée comme android.support.v4.view.ViewPager. Dans votre fichier de mise en page, vous voudrez 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 LinearLayoutet est destiné à occuper tout l'écran, c'est pourquoi layout_weightest 1 etlayout_height est 0dp.
Et la setMyScroller();méthode est pour une transition en douceur