Android中的Keyboard监听事件
前言
有关Keyboard监听事件,无非就是以下这几种情况:
1,操作显示或隐藏键盘;
2,判断当前键盘的状态;
3,键盘显示或隐藏后的拦截处理;
只要有使用到EditText,避免不了肯定会遇到以上的情况。
既然有需求,就要有实现。我今天要分享一个在github中,已经有人开源的一个库,KeyboardVisibilityEvent。
使用
dependencies {
compile 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.1.0'
}
KeyboardVisibilityEvent.setEventListener(
this,
new KeyboardVisibilityEventListener() {
@Override
public void onVisibilityChanged(boolean isOpen) {
System.out.println("========== " + isOpen);
}
});
源码解析
其实源码比较简单,总共就6个类,所以建议大家可以去阅读看看,然后源码大概就做了以下几件事:
1,计算键盘是否打开;
2,键盘事件回调;
3,Activity销毁时,键盘事件随之销毁;
4,还有常用的显示/隐藏键盘操作;
好了,我们知道了源码大概做的事情之后,我们单独一个一个来对应的看看源码。
计算键盘是否打开
该计算在该KeyboardVisibilityEvent类中的,【registerEventListener】方法,代码如下:
final ViewTreeObserver.OnGlobalLayoutListener layoutListener =
new ViewTreeObserver.OnGlobalLayoutListener() {
private final Rect r = new Rect();
private final int visibleThreshold = Math.round(
UIUtil.convertDpToPx(activity, KEYBOARD_VISIBLE_THRESHOLD_DP));
private boolean wasOpened = false;
@Override
public void onGlobalLayout() {
activityRoot.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRoot.getRootView().getHeight() - r.height(); // 得到键盘的高度,但包含了状态栏 2017/4/12 15:40
boolean isOpen = heightDiff > visibleThreshold;
if (isOpen == wasOpened) {
// keyboard state has not changed
return;
}
wasOpened = isOpen;
listener.onVisibilityChanged(isOpen);
}
};
PS:
1,activityRoot.getWindowVisibleDisplayFrame(r); // 获取当前显示的矩形
2,r.height() // 获取到程序显示的区域,包括标题栏,但不包括状态栏
3,activityRoot.getRootView().getHeight() // 包含了状态栏,设置全屏的话,获取的高度与r.height()一致
4,int heightDiff = activityRoot.getRootView().getHeight() - r.height(); // 得到键盘的高度,但包含了状态栏
5,至于【int visibleThreshold = Math.round(
UIUtil.convertDpToPx(activity, KEYBOARD_VISIBLE_THRESHOLD_DP));】,只是设定一个标准高度,当得到的heightDiff值大于该标准,就说明键盘已经打开,我估计这个标准高度应该是经过联调得到的大概结果;
键盘事件回调
键盘事件回调类是KeyboardVisibilityEventListener该接口。
通过ViewTreeObserver.OnGlobalLayoutListener视图树得到计算得到的键盘状态后,再通过ViewTreeObserver.OnGlobalLayoutListener回调事件。
Activity销毁时,键盘事件随之销毁
这里面用到一个关键的方法,就是application.registerActivityLifecycleCallbacks()。
那registerActivityLifecycleCallbacks有什么作用呢?它其实主要的作用就是,此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理。
那了解这个机制,那一切就变得简单了。可以看源码中AutoActivityLifecycleCallback的类,其中实现Application.ActivityLifecycleCallbacks该接口,又添加了抽象方法onTargetActivityDestroyed(),结合onActivityDestroyed()方法,就可以实现在Activity销毁时,键盘的监听事件也能随之销毁了。
常用的显示/隐藏键盘操作
常用的操作在UIUtil该类中,其中就显示、隐藏等几个方法,这里就不多讲了。
好了,这个键盘监听事件的库就分享到这里啦~~~
希望能有所帮助~