Fragment中没有onTouch方法,如何处理?
在Activity中添加如下代码:
public interface MyTouchListener {
void onTouchEvent(MotionEvent event);
}
// 保存MyTouchListener接口的列表
private List<MyTouchListener> myTouchListeners = new ArrayList<>();
/**
* 提供给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中添加如下代码:
// 将myTouchListener注册到分发列表
getActivity()).registerMyTouchListener(myTouchListener);
Activity.MyTouchListener myTouchListener = new Activity.MyTouchListener() {
@Override
public void onTouchEvent(MotionEvent event) {
...
}
};
这样当有touchEvent发生时,MainActivity就会调用dispatchTouchEvent,dispatchTouchEvent接着对每一个注册的对象调用其onTouchEvent函数,也就是myTouchListener中实现的方法,这样Fragment里面就等于实现了onTouchEvent函数,只需要在函数体内实现处理的事件。
Fragment中没有onBackPressed方法,如何处理?
在Activity中:
@Override
public void onBackPressed() {
if (!FragmentUtils.dispatchBackPress(getSupportFragmentManager())) {
super.onBackPressed();
}
}
在Fragment中:
Fragment implements FragmentUtils.OnBackClickListener{
...
@Override
public boolean onBackClick() {
TostUtil.show("onBackClick");
if (mKeyBoardLayout.getVisibility() == View.VISIBLE) {
hideKeyboard();
return true; // true已经消耗了事件
} else {
return false;
}
}
}
参阅:
网友评论