安卓实现微信、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