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该类中,其中就显示、隐藏等几个方法,这里就不多讲了。

好了,这个键盘监听事件的库就分享到这里啦~~~

希望能有所帮助~

你可能感兴趣的:(Android中的Keyboard监听事件)