Android 如何在键盘弹出时隐藏BottomNavigationView且不遮挡输入框
方案1:调整键盘监听时序,主动触发布局重绘
问题核心是键盘弹出的adjustResize回调与底部导航隐藏的时序冲突,系统先按存在底部导航的高度完成布局调整,再隐藏导航后不会自动重新计算高度,导致输入框被遮挡。修改监听代码如下:
KeyboardVisibilityEvent.setEventListener(this) { isOpen -> binding.bottomNavView.post { // 将操作加入主线程消息队列尾部,等系统默认布局调整完成后执行 binding.bottomNavView.visibility = if (isOpen) View.GONE else View.VISIBLE // 主动请求根布局重新测量绘制,适配新的可用高度 binding.activityRoot.requestLayout() } }
额外给chat_fragment.xml的根布局添加android:fitsSystemWindows="false",避免系统自动插入padding打乱输入框位置。
方案2:用位移动画隐藏底部导航,不改变布局高度
不用设置GONE触发布局重绘,直接将底部导航移出屏幕可视区域,既不会浮在键盘上方,也不会影响原有布局高度计算:
KeyboardVisibilityEvent.setEventListener(this) { isOpen -> binding.bottomNavView.animate() .translationY(if (isOpen) binding.bottomNavView.height.toFloat() else 0f) .setDuration(100) // 与系统键盘弹出动画时长保持一致,体验更流畅 .start() }
该方案不需要额外调整布局逻辑,也不会出现输入框遮挡问题,适配性更强。
方案3:在ChatFragment生命周期单独控制配置
如果只有聊天页存在该问题,可以直接在Fragment生命周期层面控制底部导航和软键盘配置,不需要全局监听键盘:
// ChatFragment的onResume方法 override fun onResume() { super.onResume() activity?.window?.setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN ) // 进入聊天页直接隐藏底部导航 (activity as MainActivity).binding.bottomNavView.visibility = View.GONE } // ChatFragment的onPause方法 override fun onPause() { super.onPause() activity?.window?.setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE ) // 离开聊天页恢复底部导航 (activity as MainActivity).binding.bottomNavView.visibility = View.VISIBLE }
内容的提问来源于stack exchange,提问作者nikitaluga
相关产品推荐
相关产品推荐

