前言

有关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 常用的监听器,Android中的Keyboard监听事件相关推荐

  1. android ViewPager实现无限轮播和设置监听事件

    ViewPager的无限轮播,主要以实现为主.代码如下 首先定义activity_viewpager.xml: <LinearLayout android:layout_width=" ...

  2. HTML学习14-js 内置对象 Date() 常用的日期的方法 定时器 倒计时 监听事件

    内置对象 内置对象: 内置对象就是指这个语言自带的一些对象,供开发者使用,这些对象提供了一些常用的或是最基本而必要的功能. 手机买来就能发短信 就能打电话 日期函数 ( Date() ) 这个函数 ( ...

  3. html中单选按钮设置监听事件,浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio...

    浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio 若是只引用jquery的话,监听单选按钮改变事件如下: 男 女 $(document).ready(functio ...

  4. Android 自定义Dialog类,并在Activity中实现按钮监听事件

    实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现的按钮 ...

  5. 钉钉中添加回调监听事件

    此类是HttpRequest.java -------------------------------------------------------------------------------- ...

  6. html中下拉列表监听事件,ExtJS 下拉框监听事件、日期选择器监听事件、实现动态给items添加删除数据...

    本文将为您描述ExtJS 下拉框监听事件.日期选择器监听事件.实现动态给items添加删除数据,具体实现方法: 1.下拉框 下拉框选择时,触发事件的方法: 在 Ext.form.ComboBox 组件 ...

  7. 常用的监听事件(android)

    刚发布过Toast,为了是自己记得牢固一些在这里写几个监听事件 分别写出不同位置的Toast 监听常用的有四种 第一种:内部类作为事件监听器类 xml中代码 <RelativeLayout xm ...

  8. Android中手势滑动监听简单实现

    文章目录 背景 实现 手势监听器的声明和创建 对重写的相关方法 onScroll() 说明 手势监听器接管View的触屏事件 验证结果 背景 项目中要实现控件的滑动监听其实还是挺常见的,这里就简单的做 ...

  9. Android的Preference的使用和监听事件

    学习了Preference的用法,这里记录下来供大家参考. 继承结构图 1.基本组成的使用 1.1组织方式(组合控件) PreferenceScreen:最平白和基础的方式 PreferenceCat ...

最新文章

  1. 机器人 陆梅东_机器人知识与实践比赛获奖 - 上海徐汇区青少年活动中心
  2. H3C大数据产品介绍
  3. POJ-1414 Life Line (暴力搜索)
  4. Lync Server 2013企业版部署系列之五:前端服务器软件准备
  5. Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目
  6. 谷歌android go 销量,谷歌Android Go进入尴尬期:目前仅十多个App专门适配
  7. 二十、UE和UI的区别
  8. 跨交换机的VLAN 部署
  9. jeesite应用实战(数据增删改查),认真读完后10分钟就能开发一个模块
  10. (实测有用)登录Github显示“您的连接不是专用连接”和”GitHub.com拒绝了我们的连接请求“解决办法!!!
  11. MPC5748G笔记 CAN can_pal
  12. 优漫动游平面设计的形式美
  13. 超好用的画图工具推荐
  14. CUDA 学习(CUDA实战 第四章)
  15. 线性筛(Linear Sieve)
  16. 使用devops的团队_DevOps团队如何为网络星期一做准备
  17. 判断平年还是闰年,一个月有多少天,一年的第几天
  18. 如何在手机上用python画玫瑰_python绘制玫瑰的实现代码
  19. 搜狗做AI:围绕语言,力出一孔
  20. 吴恩达深度学习 | (20) 序列模型专项课程第一周学习笔记

热门文章

  1. centos 创建 logrotate 进行日志分割
  2. pip安装包时遇到的Bug
  3. 动态生成能够局部刷新的验证码【AJAX技术】---看了不懂赔你钱
  4. java switch语句练习 从键盘输入2个数和一个运算符(+,-,*,/),输出运算结果
  5. 简单的图片处理servlet
  6. [转]asp.net权限认证:HTTP基本认证(http basic)
  7. 解决VS 于 致命错误 RC1015: 无法打开包含文件 #39;afxres.h#39; 问题
  8. 打印给定字符串中字符的所有排列
  9. 菜鸟学exchange之一:exchange邮件系统的简单安装和部署
  10. linux conntrack命令 路由连接 跟踪表 显示删除监听记录