fragment如何获取activity的点击事件

        如今在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);
}

        使用以上四步即可完成在fragment获取activity点击事件的需求。

猜你喜欢

转载自blog.csdn.net/weixin_42433094/article/details/126177332