情景:Fragment需要实现onTouchEvent事件监听,来进行滑动切换Fragment。
问题:Fragement含有ListView,直接通过Fragment的最外层子控件setOnTouchListener,发现与ListView点击事件冲突。
解决:Activity调用dispatchTouchEvent,dispatchTouchEvent接着对每一个注册的对象调用myTouchListener中实现的方法,即可解决ListView和左右滑动冲突的问题。
Activity:
public interface MyTouchListener {
public void onTouchEvent(MotionEvent event);
}
/**
* 保存MyTouchListener接口的列表
*/
private ArrayList<MyTouchListener> myTouchListeners = new ArrayList<LiveVideoActivity.MyTouchListener>();
/**
* 提供给Fragment通过getActivity()方法来注册自己的触摸事件的方法
*
* @param listener
*/
public void registerMyTouchListener(MyTouchListener listener) {
myTouchListeners.add(listener);
}
/**
* 提供给Fragment通过getActivity()方法来取消注册自己的触摸事件的方法
* @param listener
*
*/
public void unRegisterMyTouchListener(MyTouchListener listener) {
myTouchListeners.remove(listener);
}
/**
* 分发触摸事件给所有注册了MyTouchListener的接口
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
for (MyTouchListener listener : myTouchListeners) {
listener.onTouchEvent(ev);
}
return super.dispatchTouchEvent(ev);
}
Fragment:
private MyTouchListener myTouchListener ;
myTouchListener = new MyTouchListener();
@Override
public void onResume() {
super.onResume();
((LiveVideoActivity) getActivity()).registerMyTouchListener(myTouchListener);
}
@Override
public void onPause() {
super.onPause();
((LiveVideoActivity) getActivity()).unRegisterMyTouchListener(myTouchListener);
}
class MyTouchListener implements LiveVideoActivity.MyTouchListener{
@Override
public void onTouchEvent(MotionEvent event) {
dealTouchEvent(event);
}
}
private void dealTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPosX = event.getX();
mCurPosX = mPosX;
break;
case MotionEvent.ACTION_MOVE:
mCurPosX = event.getX();
break;
case MotionEvent.ACTION_UP:
if (mCurPosX - mPosX > 0
&& (Math.abs(mCurPosX - mPosX) > 25)) {
//向右滑動
} else if (mCurPosX - mPosX < 0
&& (Math.abs(mCurPosX - mPosX) > 25)) {
//向左滑动
}
break;
}
}