Android N版本 设置深层界面无法监听按键事件解决方法!
基于MTK平台,原创请多支持,谢谢
由于Android N之前深层界面类继承至Activity,对于返回按键的处理直接重写onKeyDown方法保存了当前编辑的内容。
而在N平台上,google将深层界面实现成为了一个SettingsFragment,不能直接重写Activity的onKeyDown方法监听返回事件了。
google源代码中试图通过view的setOnKeyListener方法其监听返回按键事件,但实际情况却不起作用。
经调查,View的setOnKeyListener方法设置的监听按键事件只对于当前获得Focus的View才起作用,因此源码中设置过后但其实对于设置的view有没有focus,因此不能正常监听返回事件。
【解决方案】
由于View的setOnKeyListener只对于获得focus的View才起作用,但Focus View在程序运行期间又是动态变化的。因此修复方式为将当前页面中所有有获得focus能力的子view都设置它的OnKeyListener到一个监听。
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- view.setOnKeyListener(this);
+ if (view instanceof ViewGroup) {
+ final ViewGroup vg = (ViewGroup) view;
+ for (int i = vg.getChildCount() - 1; i >= 0; i--) {
+ if(vg.getChildAt(i) instanceof ViewGroup){
+ final ViewGroup vg_g = (ViewGroup) vg.getChildAt(i);
+ for (int j = vg_g.getChildCount() - 1; j >= 0; j--) {
+ vg_g.getChildAt(j).setOnKeyListener(this);
+ }
+ }else{
+ vg.getChildAt(i).setOnKeyListener(this);
+ }
+ }
+ }
}