其他分享
首页 > 其他分享> > 安卓实现微信、QQ输入框自适应软键盘高度

安卓实现微信、QQ输入框自适应软键盘高度

作者:互联网

前言

安卓环境,输入法的软键盘弹出时默认会改变window大小,但是可以肯定,微信和QQ都不是采用这种策略,一个检测方法:点击微信输入框,然后点击+号按钮弹出抽屉菜单并隐藏软键盘,可以发现这个过程很流畅,就仿佛抽屉原本就在软键盘下方藏着一样,而此过程如果采用adjustResize策略会导致window大小变大,然后抽屉需要scroll出来,会出现一个闪烁。于是可以断定,我们的思路是采用adjustNothing策略——软键盘不改变window大小。

问题

我们需要保证输入框的底边刚好在软键盘上方,于是我们需要想办法获取软键盘实时高度,获得这个高度之后,我们就可以通过scroll父容器或者直接设置输入框的y坐标即可。

思路

软键盘高度没有直接监听办法,我们可以新建一个透明PopupWindow,PopupWindow的软键盘策略采用adjustResize,我们只需监听这个window的高度变化即可。

监听window的高度变化可以通过PopupWindow的contentView.viewTreeObserver.addOnGlobalLayoutListener实现

Kotlin代码:

class SoftKeyboardHeightDetector(private val activity: Activity, callback: (height: Int) -> Unit) : PopupWindow(activity) {
    init {
        width = 0
        height = LayoutParams.MATCH_PARENT
        val view = View(activity)
        contentView = view
        softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE
        inputMethodMode = INPUT_METHOD_NEEDED
//        setBackgroundDrawable(ColorDrawable(Color.RED))
        val rect = Rect()
        var lastHeight = -1
        view.viewTreeObserver.addOnGlobalLayoutListener {
            view.postDelayed(50) { // 需要适当延迟,否则可能无法正确获取高度
                view.getWindowVisibleDisplayFrame(rect)
                val h = view.rootView.height - rect.height()
                logD("keyboard height $h")
                if (lastHeight != h) {
                    lastHeight = h
                    callback(h)
                }
            }
        }
    }

    fun start() {
        activity.apply {
            window.decorView.post {
                showAsDropDown(window.decorView, Gravity.NO_GRAVITY, 0, 0)
            }
        }
    }

    fun stop() {
        dismiss()
    }
}

效果

正在做的一个开源聊天项目
效果

标签:QQ,微信,安卓,软键盘,height,输入框,window,activity,view
来源: https://blog.csdn.net/HelloMyPeople/article/details/119490336