You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:27:03