您的位置:首页 > 移动开发 > Android开发

Android ViewPager与子控件点击事件冲突的解决方案

2015-09-16 17:59 597 查看
ViewPager里面经常会放置很多东西,本文提供一个解决思路。

子空间不使用OnClickListener,而使用OnTouchListener:

class OnClick implements View.OnTouchListener {

        private String title;
      
        public ZhiDeSouOnClick(String title) {
            this.title = title;       
        }

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getAction();
            switch (action) {
                case MotionEvent.ACTION_DOWN:  
                    title_all = title;
                    break;
            }
            return false;
        }
    }
例如上面,这是子控件的TouchListener事件,我要传递一个“title”参数,我定义一个全局的“title_all”参数,在Touch事件中将title传出去。这里面TouchListener的返回值一定要是false,因为返回false的话,我们手指触摸到屏幕的事件就不会被ViewPager里的子控件拦截,而是会继续向下传递。但是,一旦返回了false,那么子控件就只有:
MotionEvent.ACTION_DOWN
这个响应事件,其他的响应事件捕捉不到,这也是正常的。
然后在ViewPager的Touch事件中进行处理。

viewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        startX = (int) event.getX();
                        startY = (int) event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        break;
                    case MotionEvent.ACTION_UP:
                        endX = (int) event.getX();
                        endY = (int) event.getY();
                        if (Math.abs(endX - startX) < 50 && Math.abs(endY - startY) < 50) {
                            try {
                                Toast.makeText(getApplicationContext(), "这是从子控件传来的参数,在ViewPager中响应的事件"+title_all, Toast.LENGTH_SHORT).show();
                            } catch (Exception e) {
                            }
                        }
                        break;
                }
                return false;
            }
        });
这样处理了之后子空间就不会拦截ViewPager的滑动了,因为我们在子空间的Touch事件中返回了false。这里子空间一定要用Touch,如果用Click事件的话,就会拦截,导致ViewPager无法滑动。子控件将想要实现的方法的参数传出去(由此来判断是ViewPager中的哪个子控件),然后在ViewPager的Touch事件中进行处理。在ACTION_UP中进行计算,当用户的手指移动小于50的时候就触发方法。
这样就解决了ViewPager与子控件的点击事件冲突。

我最开始遇到这个问题的时候是想如何解决冲突,可是最后都有这样那样的问题。后来我换了个思路,与其解决两个事件的冲突,那么不如将两个事件变成一个事件,这样不久没有冲突了么,然后配一些参数不久得了。就是上面的代码啦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: