Musisz podklasę ViewPager. onTouchEventzawiera wiele dobrych rzeczy, których nie chcesz zmieniać, na przykład pozwalając, aby widoki dziecka były poprawiane. onInterceptTouchEventjest tym, co chcesz zmienić. Jeśli spojrzysz na kod ViewPager, zobaczysz komentarz:
/*
* 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.
*/
Oto kompletne rozwiązanie:
Najpierw dodaj tę klasę do swojego srcfolderu:
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*/);
}
}
}
Następnie upewnij się, że używasz tej klasy zamiast zwykłej ViewPager, którą prawdopodobnie określiłeś jako android.support.v4.view.ViewPager. W pliku układu będziesz chciał określić go za pomocą czegoś takiego:
<com.yourcompany.NonSwipeableViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
Ten konkretny przykład znajduje się w punkcie a LinearLayouti ma zajmować cały ekran, dlatego layout_weightjest to 1, a layout_height0dp.
I setMyScroller();sposób jest płynne przejście