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
相关产品推荐
相关产品推荐

