Fragment中实现dispatchKeyEvent事件

来源:互联网 发布:mac怎么下载ed2k 编辑:程序博客网 时间:2024/05/21 17:45

前言

我们在开发中发现,在Fragment中是无法重写dispatchKeyEvent(KeyEvent event)函数的。  那么如果确实想在Fragment中处理KeyEvent事件逻辑的话,就没有办法了么?当然有办法,有什么能难倒程序猿~~  

解决方法

解决方法有两种。  

第一种
通过接口把Fragment所关联的activity的KeyEvent事件传递给Fragment。具体做法如下:
首先创建一个接口:

public interface FragmentKeyeventListener {    boolean onFragmentKeyEvent(KeyEvent event);}

接着用fragment来实现这个接口,然后在fragment所attached的activity中设置FragmentKeyeventListener 接口为其的成员变量
并给它设置set方法。Fragment代码如下:

public class TestFragment extends Fragment implements FragmentKeyeventListener{    TestActivity testActivity ;    @Override    public void onAttach(Activity activity) {        super.onAttach(activity);        testActivity = (TestActivity)activity;        testActivity.setFragmentKeyeventListener(this);    }    @Override    public boolean onFragmentKeyEvent(KeyEvent event) {        return false;    }}

activity部分代码如下:

public void     setFragmentKeyeventListener(FragmentKeyeventListener fragmentKeyeventListener) {        this.fragmentKeyeventListener = fragmentKeyeventListener;    }    @Override    public boolean dispatchKeyEvent(KeyEvent event) {        if (fragmentKeyeventListener!=null){            fragmentKeyeventListener.onFragmentKeyEvent(event);            return true;        }        return super.dispatchKeyEvent(event);    }

这样activity的keyevent事件就传到了它所关联的Fragment的中了,我们就可以在Fragment中处理按键事件了。
第二种
Fragment的布局展示是在:

@Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        return super.onCreateView(inflater, container, savedInstanceState);    }

onCreateView中控制的,我们可以通过return 一个View来显示fragment的布局这个大家都知道
return的这个view可以是inflater得到的,也可以是自定义的一个View。
那第二种处理keyevent的方法就是在自定义view中实现的。
我们在fragment对应的自定义布局view中可以重写dispatchKeyEvent方法,处理逻辑。
那么就相当于这个view的宿主fragment处理了keyevent逻辑。
代码如下:

public class FragmenLayoutView extends ViewGroup {    public FragmenLayoutView(Context context) {        super(context);    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {    }    @Override    public boolean dispatchKeyEvent(KeyEvent event) {        return super.dispatchKeyEvent(event);        //处理KeyEvent事件逻辑    }}
@Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        return new FragmenLayoutView(container.getContext());    }
原创粉丝点击