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

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与子控件的点击事件冲突。

我最开始遇到这个问题的时候是想如何解决冲突,可是最后都有这样那样的问题。后来我换了个思路,与其解决两个事件的冲突,那么不如将两个事件变成一个事件,这样不久没有冲突了么,然后配一些参数不久得了。就是上面的代码啦~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

赵勇Yaphet

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值