Android聊天页隐藏键盘时异常向下滚动问题如何解决?
问题根因
- 当前逻辑仅适配了键盘弹出(差值为正)的滚动场景,键盘收起时(差值为负,屏幕可用高度增加,布局向下延展)的滚动逻辑没有匹配聊天页面需要锚定最新消息的特性
- 原有else分支直接滚动verticalScrollOffset.get()的逻辑会错误地将页面向顶部方向偏移,偏移距离刚好等于键盘高度
- adjustResize模式下键盘收起触发布局重绘后,需要主动将滚动位置对齐到最后一条消息底部,不能直接用通用滚动差值计算
修复方案
以下是适配聊天场景的修正代码:
addOnLayoutChangeListener { _, _, _, _, bottom, _, _, _, oldBottom -> val keyboardHeightDelta = oldBottom - bottom // 增加100px阈值过滤导航栏、状态栏等小幅度布局变化的干扰 if (keyboardHeightDelta.absoluteValue > 100) { post { if (keyboardHeightDelta > 0) { // 键盘弹出,保留原有滚动逻辑,偏移对应距离露出输入框和最新消息 scrollBy(0, keyboardHeightDelta) } else { // 键盘收起,直接滚动到底部对齐最新消息 val maxScrollOffset = getChildAt(0).bottom - height scrollTo(0, maxScrollOffset.coerceAtLeast(0)) } } } }
- 如果你的聊天列表使用RecyclerView实现,可将键盘收起时的滚动逻辑替换为
smoothScrollToPosition(adapter.itemCount - 1),体验更流畅 - 原有Manifest中配置的
adjustResize|stateHidden属性无需修改,符合布局适配要求
内容的提问来源于stack exchange,提问作者Piyush Maheswari
相关产品推荐
相关产品推荐

