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

BottomSheetDialog中EditText关闭后键盘异常弹出问题求助

解决BottomSheetDialog关闭后键盘莫名弹出的问题

问题核心原因

之前的隐藏键盘方法依赖inputMethodManager.isAcceptingText()判断,但在对话框生命周期后期(如onPause/onDestroyView),该判断可能已返回false,实际键盘仍处于显示状态;同时对话框关闭时视图可能已脱离窗口,导致windowToken失效,无法通过生命周期方法有效隐藏键盘。

解决方案

1. 修改隐藏键盘方法,移除无效判断

去掉isAcceptingText()的校验,直接强制执行隐藏操作,避免判断逻辑干扰:

fun Activity.hideSoftKeyboard(view: View? = null) {
    val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    // 优先使用目标View的windowToken,其次取当前焦点View的token
    val windowToken = view?.windowToken ?: currentFocus?.windowToken ?: return
    inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

2. 在关闭触发点主动隐藏键盘

不要依赖生命周期方法,在对话框关闭的直接触发时机调用隐藏逻辑:

  • 点击SAVE按钮时:
private fun setClickListeners() {
    binding.btnSave.setOnClickListener {
        // 先隐藏键盘再处理保存和关闭
        requireActivity().hideSoftKeyboard(binding.etTitle)
        // 执行你的保存逻辑
        dismiss()
    }
}
  • 点击对话框外部关闭时:
    在onCreateDialog中设置对话框的关闭监听,确保关闭前隐藏键盘:
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
    dialog.setOnDismissListener {
        requireActivity().hideSoftKeyboard(binding.etTitle)
    }
    return dialog
}

3. 补充生命周期方法的兜底处理

在onDestroyView中添加兜底调用,确保万无一失:

override fun onDestroyView() {
    requireActivity().hideSoftKeyboard(binding.etTitle)
    super.onDestroyView()
}

说明

通过在关闭触发点提前处理,能确保键盘在对话框销毁前就被隐藏;修改后的隐藏方法跳过了不可靠的状态判断,直接针对有效windowToken执行操作,解决了日志返回false但键盘未隐藏的问题。

内容的提问来源于stack exchange,提问作者VanSuTuyDuyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:35:26