// 通知父层ViewGroup,你不能截获
public boolean dispatchTouchEvent(MotionEvent ev) {
bannerViewPager.requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
// 也可以写成这样,当用户按下的时候,我们告诉父组件,不要拦截我的事件(这个时候子组件是可以正常响应事件的),拿起之后就会告诉父组件可以阻止。
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
bannerViewPager.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
bannerViewPager.requestDisallowInterceptTouchEvent(false);
break;
}
return true;
}
第二种情况,Activity中嵌套fragment时无法做手势监听事件时,需要做的处理:
/**
* 以下的几个方法用来,让fragment能够监听touch事件
*/
private ArrayList<MyOnTouchListener> onTouchListeners = new ArrayList<MyOnTouchListener>(10);
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
for (MyOnTouchListener listener : onTouchListeners) {
listener.onTouch(ev);
}
return super.dispatchTouchEvent(ev);
}
public void registerMyOnTouchListener(MyOnTouchListener myOnTouchListener) {
onTouchListeners.add(myOnTouchListener);
}
public void unregisterMyOnTouchListener(MyOnTouchListener myOnTouchListener) {
onTouchListeners.remove(myOnTouchListener);
}
public interface MyOnTouchListener {
public boolean onTouch(MotionEvent ev);
}
Fragment中该这样干:
public void onAttach(Activity activity) {
super.onAttach(activity);
// 在该Fragment的构造函数中注册mTouchListener的回调
if (mTouchListener != null) {
if (getActivity() != null) {
((MainActivity) getActivity()).registerMyOnTouchListener(mTouchListener);
}
}
}
private MainActivity.MyOnTouchListener mTouchListener = new MyOnTouchListener() {
@Override
public boolean onTouch(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
bannerViewPager.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
bannerViewPager.requestDisallowInterceptTouchEvent(false);
break;
}
return true;
}
};