viewpager跟HorizontalScrollView,listview冲突的问题

这几天做到一个小app,发现一个严重的问题,因为主要布局是一个HorizontalScrollView里面装了个viewpager包含fragment,恰好我有又想实现一个侧边栏,所以发现app运行之后,侧滑栏虽然能够滑动,但是viewpager完全不能用了,不能滑动,就连tablelayout按钮都不能用了,就上网查询了下资料,原来是viewpager和HorizontalScrollView冲突了,HorizontalScrollView里面viewpager的活动被HorizontalScrollView父view拦截了,所以我们为了能够实现两者的协调,必须分情况到底父view是否该拦截子view的活动。拦截了侧滑栏就能活动,不拦截viewpager就能活动。

 

getParent().requestDisallowInterceptTouchEvent(true);把touch主动权交给子view处理,不拦截touch事件,也就是viewpager
 
getParent().requestDisallowInterceptTouchEvent(flse);把touch主动权交给父view处理,拦截touch事件,也就是HorizontalScrollView
 
具体代码如下:
 


public class ChildViewPager extends ViewPager {
    public ChildViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ChildViewPager(Context context) {
        super(context);
    } // 滑动距离及坐标 归还父控件焦点 

    private float xDistance, yDistance, xLast, yLast, xDown, mLeft;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //把touch主动权交给子view处理,不拦截touch事件,也就是viewpager getParent().requestDisallowInterceptTouchEvent(true);
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                xLast = ev.getX();
                yLast = ev.getY();
                xDown = ev.getX();
                mLeft = ev.getX();
                // 解决与侧边栏滑动冲突 
                break;
            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();
                xDistance += Math.abs(curX - xLast);
                yDistance += Math.abs(curY - yLast);
                xLast = curX;
                yLast = curY;
                if (mLeft < 100 || xDistance < yDistance) {
                    getParent().requestDisallowInterceptTouchEvent(false);
                } else {
                    if (getCurrentItem() == 0) {
                        if (curX < xDown) {
                            getParent().requestDisallowInterceptTouchEvent(true);
                        } else {
                            getParent().requestDisallowInterceptTouchEvent(false);
                        }
                    } else if (getCurrentItem() == (getAdapter().getCount() - 1)) {
                        if (curX > xDown) {
                            getParent().requestDisallowInterceptTouchEvent(true);
                        } else {
                            getParent().requestDisallowInterceptTouchEvent(false);
                        }
                    } else {
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
}  
 

在今后使用中只需要使用上述代码然后在layout布局文件中使用

 
 
<
/com.test.ChildViewPager>


然后就ok了,而且你觉得想实现侧滑栏实现的简单点,可以删除一些上面代码的东东西,当然listview也是同样的道理,相信大神的你们都会领悟。
 

你可能感兴趣的:(错误之路)