我有 ViewPager,在它下面有 10 个按钮。通过单击按钮,例如#4,寻呼机立即转到第 4 页mPager.setCurrentItem(3);。但是,我想通过水平滑动手指来禁用分页。因此,分页 仅 通过单击按钮完成。那么,我怎样才能禁用用手指滑动呢?
mPager.setCurrentItem(3);
您需要子类化ViewPager. onTouchEvent里面有很多你不想改变的好东西,比如允许子视图接触。 onInterceptTouchEvent是你想要改变的。如果您查看 的代码ViewPager,您将看到以下注释:
ViewPager
onTouchEvent
onInterceptTouchEvent
/* * 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. */
这是一个完整的解决方案:
首先,将此类添加到您的src文件夹中:
src
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*/); } } }
接下来,确保使用此类而不是ViewPager您可能指定为的常规android.support.v4.view.ViewPager. 在您的布局文件中,您需要使用以下内容指定它:
android.support.v4.view.ViewPager
<com.yourcompany.NonSwipeableViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" />
这个特殊的例子在 a 中LinearLayout,是为了占据整个屏幕,这就是为什么layout_weight是 1 和layout_height0dp。
LinearLayout
layout_weight
layout_height
方法 setMyScroller(); 是平滑过渡
setMyScroller();