如果当前页面是Activity那么可以直接重写dispatchTouchEvent
方法。在ACTION_DOWN
事件时,判断点击的坐标是否在输入框坐标的上面,如果是那么调用隐藏键盘的方法。
如果当前页面是Fragment,那么Fragment中增加一个dispatchTouchEvent
方法,内部逻辑同上,在Fragment所依赖的Activity代码中将dispatchTouchEvent
事件透传给Fragment的dispatchTouchEvent
,如果键盘需要隐藏,Fragment的dispatchTouchEvent
方法需要返回true
,表示消费本次所有触摸事件,不再继续传递。
3. 如何获取键盘高度
3.1 有没有系统的api可以供我们获取键盘高度?
3.2 有什么方法可以间接获取键盘高度?
系统给我们提供了一个页面布局变化的监听器OnGlobalLayoutListener
,这个监听器可以通知我们布局发生改变,我们可以在此时获取自己的高度,再通过屏幕宽度和状态栏高度等间接计算出键盘的高度。
- 那么就有一个问题,
OnGlobalLayoutListener
接收到变化动作时,一定是键盘弹出或消失么?
那为什么使用
OnGlobalLayoutListener
可以监听键盘的状态?
- 有没有使用
OnGlobalLayoutListener
监听键盘失效的情景?
3.3 获取键盘高度
在一般情况下,我们对Activity
的PhoneWindow
中DecorView
的布局变化进行监听,一般来说,变化值超过60dp
就可以认为是键盘弹出或收起了。而且在非全屏主题下,
键盘高度 = 屏幕高度 - 状态栏高度 - 主视图高度 - 标题栏高度, 于是我们可以通过下面代码间接计算出键盘高度。
mDecorView = this.getActivity().getWindow().getDecorView();
mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
mDecorView.getWindowVisibleDisplayFrame(rect);
int displayHeight = rect.bottom;
if (Math.abs(displayHeight - mOldDecorViewHeight) > dp60) {
mOldDecorViewHeight =displayHeight;
int rootHeight = mRoot.getHeight();
int statusBarHeight = getStatusBarHeight();
int screenHeight = getScreenHeight();
int titleBarHeight = getTitleBarHeight();
int keyboardHeight = screenHeight - statusBarHeight -rootHeight - titleBarHeight;
Log.i(“lxc”, "keyboardHeight —> " + keyboardHeight + " 键盘: " + (keyboardHeight > 0 ? “弹出” : “收起”));
}
}
“lxc”, "keyboardHeight —> " + keyboardHeight + " 键盘: " + (keyboardHeight > 0 ? “弹出” : “收起”));
}
}