Viewpager禁止滑动的方法

本文介绍了两种禁用ViewPager滑动的方法。方法1是为ViewPager设置OnTouchListener并返回true阻止触摸事件传播;方法2是重写ViewPager的onInterceptTouchEvent方法,选择性地返回false来阻止滑动。实践表明,方法2能有效禁止ViewPager的滑动。
方法原理

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不能解决问题。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值