如今在activity中使用fragment的布局非常常见,那么如果想在fragment获取activity点击事件,如何获得呢?
今天要做一个功能,即fragment中有一个弹框,需要在整个activity被触摸时将该弹框进行隐藏,但是在fragment中的view只能获取到fragment被触摸的事件,而不能直接获取activity的触摸事件,如果想要获取activity的触摸事件,我们可以通过回调的方式在fragment中获取到activity的触摸事件,然后做相应操作。
具体操作如下:
一、定义接口
先定义一个接口
public interface FragmentKeyEventListener {
void onFragmentKeyEvent(MotionEvent event);
}
二、在需要获取activity触摸事件的Fragment中implements该接口,并实现该接口方法。
public class WallpaperFragment implements FragmentKeyEventListener{
............................
@Override
public void onFragmentKeyEvent(MotionEvent event) {
//do something what you want to do}
............................
}
三、在activity中提供setFragmentKeyEventListener()方法,给fragment调用,用来设置监听器mFragmentKeyEventListener。该监听器持有onFragmentKeyEvent()方法,在activity被触摸后,就会自动调用到dispatchTouchEvent()方法,在该方法中使用监听器调用onFragmentKeyEvent()方法,即可回调到步骤二中在fragment中实现的onFragmentKeyEvent()方法,并执行fragment中的onFragmentKeyEvent()方法的具体操作,代码如下:
public class MainActivity{
private FragmentKeyEventListener mFragmentKeyEventListener;
//给fragment提供方法,用来设置监听器
public void setFragmentKeyEventListener(WallpaperFragment wallpaperFragment) {
this.mFragmentKeyEventListener = wallpaperFragment;
}//activity中获取到的触摸事件通过监听器回调给fragment(即每次activity被触摸之后,
将该触摸事件通过设置好的监听器传给fragment)
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (mFragmentKeyEventListener != null) {
mFragmentKeyEventListener.onFragmentKeyEvent(ev);
}
return super.dispatchTouchEvent(ev);
}}
四、在fragment中拿到activity的实例,然后用该activity实例调用setFragmentKeyEventListener(this)方法设置步骤三中的监听器。
@Override
public void onResume() {
super.onResume();
((MainActivity) mActivity).setFragmentKeyEventListener(this);
}