移动测试基础 Android 屏幕软键盘检测调研

TesterCai · 2018年12月29日 · 1263 次阅读

目标:判断 Android 屏幕上软键盘是否处于开启状态

结论

  • SDK 和 API 中没有软键盘隐藏变化的相关事件,但可以通过其他方式监听软键盘显示与隐藏的状态变化
  • 最佳方式:动态计算布局

APP 中隐藏软键盘的方法

  • BACK 键
  • 键盘自身提供隐藏的按扭
  • 用代码强制隐藏

检测方法

一、通过 BACK 键检测

这属于事件 (KeyEvent),能监听到

  • 方法
    • 继承 EditText,并重写方法onKeyPreIme()
    • 这个方法能在输入法前面拦截事件,从而可以发现 BACK 事件
  • 缺点:BACK 键仅仅是隐藏软键盘的其中一种方式,不全面

二、通过 override 根布局的 onMeasure 检测

软键盘弹起时 Activity 的整体布局会变

  • 方法
    • 继承 Activity 的根布局(比如 LinearLayout 或者 RelativeLayout,然后重写 onMeasure) 方法
    • 在其中判断 View 的当前高度与其本应有的高度,如果当前高度小于本应有的高度,则表明软键盘在
  • 缺点:软键盘弹起时,布局也可能没有变化(受其它条件的控制)

三、通过计算根布局的底部空隙检测(最佳)

判断根布局的可视区域与屏幕底部的差值,如果这个差大于某个值,可以认定键盘弹起了。

  • 优点:适用所有情况
  • 参考代码

    private void setListenerToRootView() {  
        final View rootView = getWindow().getDecorView().findViewById(android.R.id.content);  
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
            @Override  
            public void onGlobalLayout() {  
                LogUtils.d(TAG, "[onGlobalLayout] .. in ..");  
                boolean mKeyboardUp = isKeyboardShown(rootView);  
                if (mKeyboardUp) {  
                    LogUtils.d(TAG, "键盘弹出..");  
                } else {  
                    LogUtils.d(TAG, "键盘收起..");  
                }  
            }  
        });  
    }  
    
    private boolean isKeyboardShown(View rootView) {  
        final int softKeyboardHeight = 100;  
        Rect r = new Rect();  
        rootView.getWindowVisibleDisplayFrame(r);  
        DisplayMetrics dm = rootView.getResources().getDisplayMetrics();  
        int heightDiff = rootView.getBottom() - r.bottom;  
        return heightDiff > softKeyboardHeight * dm.density;  
    }  
    

ref

http://blog.csdn.net/xiaole0313/article/details/51537809
http://blog.csdn.net/yanjunhui2011/article/details/52472294

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册