简单可用 Android 安卓软键盘弹出、隐藏监听方法回调

该代码实现了一个SoftKeyBoardListener类,用于监听Android应用中软键盘的显示和隐藏。通过监听根视图的全局布局变化,当根视图的高度变化超过200像素时,判断为软键盘的显示或隐藏,并调用相应的回调函数。在实际使用中,可以通过调整windowSoftInputMode属性来控制布局行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工具类


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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值