工具类
import android.app.Activityimport android.graphics.Rectimport android.view.ViewTreeObserverclass 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 = visibleHeightreturn@OnGlobalLayoutListener}//根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变if (rootViewVisibleHeight == visibleHeight) {return@OnGlobalLayoutListener}//根视图显示高度变小超过200,可以看作软键盘显示了if (rootViewVisibleHeight - visibleHeight > 200) {funShow(rootViewVisibleHeight - visibleHeight)rootViewVisibleHeight = visibleHeightreturn@OnGlobalLayoutListener}//根视图显示高度变大超过200,可以看作软键盘隐藏了if (visibleHeight - rootViewVisibleHeight > 200) {funHide(visibleHeight - rootViewVisibleHeight)rootViewVisibleHeight = visibleHeightreturn@OnGlobalLayoutListener}})}}
使用
SoftKeyBoardListener().setOnSoftKeyBoardChangeListener(this@LoginActivity,{i -> binding.rlLogo.isVisible = false },{j -> binding.rlLogo.isVisible = true })
有时候弹出软键盘会使布局出现出乎预期的现象,这时候要考虑Manifest文件中Activity的windowSoftInputMode属性。
在我的开发中,想做软键盘弹出时,部分屏幕出现蒙层的结果,但是在软键盘弹出时蒙层总会自动消失,这时候在Manifest的相应Activity中加上:
android:windowSoftInputMode="adjustPan"