方法原理
ViewPager是通过重写ViewGroup实现的,它在onInterceptTouchEvent(MotionEvent ev)方法中处理了判断了触摸事件是否要拦截,然后交给onTouchEvent(MotionEvent ev)处理触摸事件。那么我们可以得到两种禁止滑动的方法:
方法1
因为dispatchTouchEvent(MotionEvent event)先执行添加的View.OnTouchListener的onTouch(View v, MotionEvent event), 并且如果onTouch返回true则不会执行onTouchEvent(),所以可以这样,
mViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
但是这种方案还是可以滑动一点点,未找到原因。这个方案实践是不行的。
方法2
重写ViewPager的onInterceptTouchEvent(MotionEvent ev)方法,选择性返回false表示不拦截。很多帖子直接新建一个继承于ViewPager的子类,这个子类重写了onInterceptTouchEvent(MotionEvent ev),如下
public NoScrollViewPager(Context context, AttributeSet attrs) {
...
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//统一不拦截,当然可以选择性不拦截
return fasle;
}
...
}
其实也可以通过重写Activity的onCreateView(…)方法,如下
public class DemoActivity extends BaseActivity {
....
@Nullable
@Override
public View onCreateView(@Nullable View parent, @NonNull String name, @NonNull Context context, @NonNull AttributeSet attrs) {
if(name.contains("ViewPager")){
return new ViewPager(context,attrs){
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int action = ev.getAction() & MotionEvent.ACTION_MASK;
if(action==MotionEvent.ACTION_MOVE){
return false;
}else{
return super.onInterceptTouchEvent(ev);
}
}
};
}else{
return super.onCreateView(parent, name, context, attrs);
}
}
....
}
总结
方法2能解决问题,方法1不能解决问题。