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