没有合适的资源?快使用搜索试试~ 我知道了~
首页详解Android中获取软键盘状态和软键盘高度
详解Android中获取软键盘状态和软键盘高度 应用场景 在Android应用中有时会需要获取软键盘的状态(即软键盘是显示还是隐藏)和软键盘的高度。这里列举了一些可能的应用场景。 场景一 当软键盘显示时,按下返回键应当是收起软键盘,而不是回退到上一个界面,但部分机型在返回键处理上有bug,按下返回键后,虽然软键盘会自动收起,但不会消费返回事件,导致Activity还会收到这次返回事件,执行回退操作,这时就需要判断,如果软键盘刚刚由显示变为隐藏状态,就不执行回退操作。 场景二 当软键盘弹出后,会将界面底部到中间的一大部分全部挡住,如果用户要查看、操作被覆盖的区域,必须先收起软键盘,这会
资源详情
资源评论
资源推荐
详解详解Android中获取软键盘状态和软键盘高度中获取软键盘状态和软键盘高度
详解详解Android中获取软键盘状态和软键盘高度中获取软键盘状态和软键盘高度
应用场景应用场景
在Android应用中有时会需要获取软键盘的状态(即软键盘是显示还是隐藏)和软键盘的高度。这里列举了一些可能的应用场
景。
场景一
当软键盘显示时,按下返回键应当是收起软键盘,而不是回退到上一个界面,但部分机型在返回键处理上有bug,按下返回键
后,虽然软键盘会自动收起,但不会消费返回事件,导致Activity还会收到这次返回事件,执行回退操作,这时就需要判断,
如果软键盘刚刚由显示变为隐藏状态,就不执行回退操作。
场景二
当软键盘弹出后,会将界面底部到中间的一大部分全部挡住,如果用户要查看、操作被覆盖的区域,必须先收起软键盘,这会
影响用户交互。所以通常需要在软键盘弹出后,将底部的一些View,例如Button,移到软键盘的上方,方便用户操作。
API的困境的困境
Android SDK中没有提供任何API来直接获取软键盘的状态和软键盘的高度,网上很多资料说InputMethodManager的isActive()
方法可以获取软键盘状态,不过实际测试发现,这个方法并没有什么用,如果它返回false,可以判断软键盘一定是隐藏的,
但如果它返回true,软键盘既可能是显示的,也可能是隐藏的。所以并不能通过isActive()方法来判断软键盘究竟是显示还是隐
藏的。要想获取软键盘的状态和软键盘的高度,只能通过间接方法实现。
注册布局变化监听注册布局变化监听
在Android中当软键盘由隐藏变为显示,或由显示变为隐藏时,会触发当前布局中View的全局布局变化。通过监听全局布局的
变化就可以得知软键盘的状态。
Android框架提供了一个ViewTreeObserver类,它是一个View视图树的观察者类。ViewTreeObserver类中定义了一系列的公
共接口(public interface)。当一个View attach到一个窗口上时就会创建一个ViewTreeObserver对象,这样当一个View的视
图树发生改变时,就会调用该对象的某个方法,将事件通知给每个注册的监听者。
OnGlobalLayoutListener是ViewTreeObserver中定义的众多接口中的一个,它用来监听一个视图树中全局布局的改变或者视
图树中的某个视图的可视状态的改变。当软键盘由隐藏变为显示,或由显示变为隐藏时,都会调用当前布局中所有存在的
View中的ViewTreeObserver对象的dispatchOnGlobalLayout()方法,此方法中会遍历所有已注册的OnGlobalLayoutListener,
执行相应的回调方法,将全局布局改变的消息通知给每个注册的监听者。
向一个View中的ViewTreeObserver注册OnGlobalLayoutListener的方法如下。
view.getViewTreeObserver().addOnGlobalLayoutListener(listener);
注册OnGlobalLayoutListener时有一些需要注意的地方。
注册的监听在不使用时需要调用removeOnGlobalLayoutListener或removeGlobalOnLayoutListener来移除监听,不然可能会
导致内存泄露。通常可以在Activity的onCreate()方法中注册监听,在onDestory()方法中移除监听。
并不是只有显示和隐藏软键盘会触发OnGlobalLayoutListener中的回调,一个View在绘制完成,或者消失时都会触发
OnGlobalLayoutListener中的回调(由于在onCreate中无法获取一个View的宽度和高度,很多时候就是通过注册
OnGlobalLayoutListener,在OnGlobalLayoutListener的回调中来获取一个View的宽度和高度)。
为了在OnGlobalLayoutListener的回调中准确的判断是否是由于软键盘状态改变引起的,以及获取软键盘的高度,还需要另外
一个接口。
获取当前窗口可见的显示区域大小获取当前窗口可见的显示区域大小
在View中提供了一个方法getWindowVisibleDisplayFrame(),此方法会返回该view所附着的窗口的可见区域大小。当软键盘显
示时,窗口的可见区域大小会被压缩,当软键盘隐藏时,窗口的可见区域大小会还原。不过并不是只有软键盘的显示和隐藏会
影响窗口的可见区域大小,像大多数的平板和部分手机上有一排虚拟按键(虚拟的返回键,Home键等),虚拟按键的显示和
隐藏也会引起窗口可见区域的变化。不过好在除了软键盘外,其他操作对窗口可见区域的影响占整个屏幕大小的比例都不是很
大,通过设置一个合理的阈值,就可以较准确的判断出是否是软键盘显示和隐藏引起的布局变化。
此外,getWindowVisibleDisplayFrame()会返回窗口的可见区域高度,通过和屏幕高度相减,就可以得到软键盘的高度了。
监听软键盘的状态变化监听软键盘的状态变化
在获取到软键盘的状态和高度后就可以执行需要的操作了。如重新布局按钮位置,设置变量,记录当前软键盘状态和上次软键
盘隐藏时间等。不过如果有多个类需要根据软键盘状态来执行一些操作,如果每个类中都去这样做一遍就很麻烦,而且也没有
必要。这时在可以自行定义一个接口,在主Activity中对软键盘状态变化进行监听,其他对软键盘状态感兴趣的类,向主
weixin_38608055
- 粉丝: 7
- 资源: 966
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0