前言
众所周知,google是没有为android提供官方的API来监听软键盘的弹出与关闭的,通俗的做法都是监听Activity这个window的布局变化来判断是否弹出/关闭软键盘
代码实现
需要说明的是,这儿并不使用ViewTreeObserver.OnGlobalLayoutListener来实现对布局的监听,而是会开一个子线程定时检查,因为在实际生产中发现,onGlobalLayout()的刷新时间是不确定的,跟布局的复杂程度有关,有的时候可能要2/3秒才会回调一次,靠这个来监听window的变化来判断是否弹出/关闭小键盘都凉成什么样了。
这儿会使用RxJava来开一个子线程,见Android Kotlin 基于RxJava的简单封装,
弄一个looper来不断循坏检查window的变化,发生变化时便会吐出一个事件。
IKeyBoardCallback
interface IKeyBoardCallback {
/**
* 当键盘显示时回调
*/
fun onKeyBoardShow()
/**
* 当键盘隐藏时回调
*/
fun onKeyBoardHidden()
}
GlobalLayoutListenerTask
class GlobalLayoutListenerTask(private val activity: Activity) : SingleTask(){
private val iKeyBoardCallbackList = mutableListOf()
private var status = NONE
private val interval = 100L
/** 全屏时的高度 */
private var fullScreenHeight = -1
/** 状态栏高度 */
private var statusBarHeight = -1
override fun onTaskRun() {
while (isRunning){
try {
//获取可视范围
val rect = Rect()
activity.window.decorView.getWindowVisibleDisplayFrame(rect)
//获取屏幕高度
val screenHeight = getFullScreenHeight(activity)
//获取状态栏高度
val statueHeight = getStatueBarHeight(activity)
//获取被遮挡高度(键盘高度)(屏幕高度-状态栏高度-可视范围)
val keyBoardHeight: Int = screenHeigh