大家都知道Fragment里面并没有按键事件的一些回调函数如disPatchKeyEvent,onKeyDown,onKeyUp那么如果我们想在Fragment中处理按键事件怎么做呢。
第一种很常见的就是定义一个接口,让Fragment实现这个接口然后在Activity中注册这个接口
并且重写相应的事件,这里以onBackPressed()为例public void onBackPressed(){ if(mBackPressedListener ! = null && mBackPressedListener.onBackPressed()) return true; return false; }
但是这样有个问题就是耦合性太强,我们setBackPressedListener的时候必须要将Activity向上转型才能注册,这就导致我们的Fragment只能在这个Activity用,如果我要在其他地方也使用到这个Fragment呢?
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mContext = activity;
((MyActivity)activity).setBackPressedListener(this);
}
不过大多数情况下都不会有这种情况。
- 第二中方法:就是自定义一个View然后在这个View中重写dispatchKeyEvent或者onKeyDown,onKeyUp回调加上我们的逻辑。
不过这个方法也有缺点那就是必须要获得焦点。为什么一定要获得焦点呢?因为KeyEvent在分发过程中会先检查自己有没有焦点如果自己获得焦点并且有边界就会自己处理KeyEvent事件,如果不是就交给取得了焦点的子View。这一点和TouchEent有点不同,因为TouchEvent是优先让子View处理而KeyEent则是自己优先处理。
虽然局限性很大,但也不失为一个办法。