工具类
import android.app.Activity
import android.graphics.Rect
import android.view.ViewTreeObserver
class SoftKeyBoardListener {
fun setOnSoftKeyBoardChangeListener(
activity: Activity,
funShow: (i: Int) -> Unit,
funHide: (i: Int) -> Unit
) {
//纪录根视图的显示高度
var rootViewVisibleHeight = 0
//获取activity的根视图
val rootView = activity.window.decorView
//监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
rootView.viewTreeObserver.addOnGlobalLayoutListener(
//获取当前根视图在屏幕上显示的大小
ViewTreeObserver.OnGlobalLayoutListener {
val r = Rect()
rootView.getWindowVisibleDisplayFrame(r)
val visibleHeight = r.height()
if (rootViewVisibleHeight == 0) {
rootViewVisibleHeight = visibleHeight
return@OnGlobalLayoutListener
}
//根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
if (rootViewVisibleHeight == visibleHeight) {
return@OnGlobalLayoutListener
}
//根视图显示高度变小超过200,可以看作软键盘显示了
if (rootViewVisibleHeight - visibleHeight > 200) {
funShow(rootViewVisibleHeight - visibleHeight)
rootViewVisibleHeight = visibleHeight
return@OnGlobalLayoutListener
}
//根视图显示高度变大超过200,可以看作软键盘隐藏了
if (visibleHeight - rootViewVisibleHeight > 200) {
funHide(visibleHeight - rootViewVisibleHeight)
rootViewVisibleHeight = visibleHeight
return@OnGlobalLayoutListener
}
})
}
}
使用
SoftKeyBoardListener().setOnSoftKeyBoardChangeListener(this@LoginActivity,
{ i -> binding.rlLogo.isVisible = false },
{ j -> binding.rlLogo.isVisible = true }
)
有时候弹出软键盘会使布局出现出乎预期的现象,这时候要考虑Manifest文件中Activity的windowSoftInputMode属性。
在我的开发中,想做软键盘弹出时,部分屏幕出现蒙层的结果,但是在软键盘弹出时蒙层总会自动消失,这时候在Manifest的相应Activity中加上:
android:windowSoftInputMode="adjustPan"