android 常用的监听器,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 常用的监听器,Android中的Keyboard监听事件相关推荐
- android ViewPager实现无限轮播和设置监听事件
ViewPager的无限轮播,主要以实现为主.代码如下 首先定义activity_viewpager.xml: <LinearLayout android:layout_width=" ...
- HTML学习14-js 内置对象 Date() 常用的日期的方法 定时器 倒计时 监听事件
内置对象 内置对象: 内置对象就是指这个语言自带的一些对象,供开发者使用,这些对象提供了一些常用的或是最基本而必要的功能. 手机买来就能发短信 就能打电话 日期函数 ( Date() ) 这个函数 ( ...
- html中单选按钮设置监听事件,浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio...
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio 若是只引用jquery的话,监听单选按钮改变事件如下: 男 女 $(document).ready(functio ...
- Android 自定义Dialog类,并在Activity中实现按钮监听事件
实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现的按钮 ...
- 钉钉中添加回调监听事件
此类是HttpRequest.java -------------------------------------------------------------------------------- ...
- html中下拉列表监听事件,ExtJS 下拉框监听事件、日期选择器监听事件、实现动态给items添加删除数据...
本文将为您描述ExtJS 下拉框监听事件.日期选择器监听事件.实现动态给items添加删除数据,具体实现方法: 1.下拉框 下拉框选择时,触发事件的方法: 在 Ext.form.ComboBox 组件 ...
- 常用的监听事件(android)
刚发布过Toast,为了是自己记得牢固一些在这里写几个监听事件 分别写出不同位置的Toast 监听常用的有四种 第一种:内部类作为事件监听器类 xml中代码 <RelativeLayout xm ...
- Android中手势滑动监听简单实现
文章目录 背景 实现 手势监听器的声明和创建 对重写的相关方法 onScroll() 说明 手势监听器接管View的触屏事件 验证结果 背景 项目中要实现控件的滑动监听其实还是挺常见的,这里就简单的做 ...
- Android的Preference的使用和监听事件
学习了Preference的用法,这里记录下来供大家参考. 继承结构图 1.基本组成的使用 1.1组织方式(组合控件) PreferenceScreen:最平白和基础的方式 PreferenceCat ...
最新文章
- 机器人 陆梅东_机器人知识与实践比赛获奖 - 上海徐汇区青少年活动中心
- H3C大数据产品介绍
- POJ-1414 Life Line (暴力搜索)
- Lync Server 2013企业版部署系列之五:前端服务器软件准备
- Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目
- 谷歌android go 销量,谷歌Android Go进入尴尬期:目前仅十多个App专门适配
- 二十、UE和UI的区别
- 跨交换机的VLAN 部署
- jeesite应用实战(数据增删改查),认真读完后10分钟就能开发一个模块
- (实测有用)登录Github显示“您的连接不是专用连接”和”GitHub.com拒绝了我们的连接请求“解决办法!!!
- MPC5748G笔记 CAN can_pal
- 优漫动游平面设计的形式美
- 超好用的画图工具推荐
- CUDA 学习(CUDA实战 第四章)
- 线性筛(Linear Sieve)
- 使用devops的团队_DevOps团队如何为网络星期一做准备
- 判断平年还是闰年,一个月有多少天,一年的第几天
- 如何在手机上用python画玫瑰_python绘制玫瑰的实现代码
- 搜狗做AI:围绕语言,力出一孔
- 吴恩达深度学习 | (20) 序列模型专项课程第一周学习笔记
热门文章
- centos 创建 logrotate 进行日志分割
- pip安装包时遇到的Bug
- 动态生成能够局部刷新的验证码【AJAX技术】---看了不懂赔你钱
- java switch语句练习 从键盘输入2个数和一个运算符(+,-,*,/),输出运算结果
- 简单的图片处理servlet
- [转]asp.net权限认证:HTTP基本认证(http basic)
- 解决VS 于 致命错误 RC1015: 无法打开包含文件 #39;afxres.h#39; 问题
- 打印给定字符串中字符的所有排列
- 菜鸟学exchange之一:exchange邮件系统的简单安装和部署
- linux conntrack命令 路由连接 跟踪表 显示删除监听记录