Devi sottoclassare ViewPager. onTouchEventha un sacco di cose buone che non vuoi cambiare come permettere alle viste dei bambini di ottenere tocchi. onInterceptTouchEventè quello che vuoi cambiare. Se guardi il codice per ViewPager, vedrai il commento:
/*
* 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.
*/
Ecco una soluzione completa:
Per prima cosa, aggiungi questa classe alla tua srccartella:
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*/);
}
}
}
Quindi, assicurati di utilizzare questa classe anziché la normale ViewPager, che probabilmente hai specificato come android.support.v4.view.ViewPager. Nel tuo file di layout, ti consigliamo di specificarlo con qualcosa del tipo:
<com.yourcompany.NonSwipeableViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
Questo esempio particolare è in a LinearLayouted è pensato per occupare l'intero schermo, motivo per cui layout_weightè 1 elayout_height è 0dp.
E il setMyScroller();metodo è per una transizione graduale