Android(安卓)ViewPager与子控件点击事件冲突的解决方案
16lz
2021-01-24
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与子控件的点击事件冲突。
我最开始遇到这个问题的时候是想如何解决冲突,可是最后都有这样那样的问题。后来我换了个思路,与其解决两个事件的冲突,那么不如将两个事件变成一个事件,这样不久没有冲突了么,然后配一些参数不久得了。就是上面的代码啦~
更多相关文章
- Android(安卓)获取验证码倒计时实现
- Android(安卓)Material design设计风格
- Android用户界面
- Android(安卓)Editable
- RxJava2+retrofit简单使用,基于POST请求封装工具类
- webview
- Android(安卓)自定义控件在Android(安卓)Studio中xmlns不识别
- android send key event
- Android(安卓)自定义控件属性