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

Android Kotlin 点击自定义Dialog内按钮无法隐藏软键盘如何解决

问题根因

Dialog拥有独立的Window层级,你原代码调用隐藏软键盘方法时传入的currentFocus属于Activity的焦点控件,无法获取Dialog内部输入框所属的Window令牌(windowToken),导致隐藏软键盘的请求不生效。

修复方案

1. 优化BaseActivity的隐藏软键盘方法

直接通过目标View获取对应的windowToken即可:

open class BaseActivity : AppCompatActivity() {

    //hide keyboard when instance of an event
    fun hideKeyboard(view: View) {
        val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
    }
}

2. 修改Dialog提交按钮的点击逻辑

直接传入Dialog内部的输入框实例,或者Dialog的根View来调用隐藏方法,不要使用Activity的currentFocus:

tvSubmitToFirestore.setOnClickListener {
    // 直接传入Dialog内的输入框获取正确windowToken,多个输入框可任选其中一个
    hideKeyboard(etProductName)
    // 也可以直接传Dialog的根View,效果一致:
    // hideKeyboard(updateDialog.window!!.decorView)

    // 原有业务逻辑保持不变
    val newProductName = etProductName.text.toString().trim()
    val newProductCategory = spinner.selectedItem.toString().uppercase()
    val newProductPrice = etProductPrice.text.toString().toDouble()

    GlobalScope.launch {
        validateProduct(newProductName, newProductCategory, newProductPrice)
    }
}

可选兜底方案

如果需要实现Dialog关闭时自动隐藏软键盘(包括用户点击返回关闭Dialog的场景),可以在Dialog初始化时添加软键盘配置:

val updateDialog = Dialog(this, R.style.CustomDialog)
updateDialog.setContentView(R.layout.dialog_update)
updateDialog.setCancelable(false)
// 新增配置:Dialog隐藏时自动关闭所属Window的软键盘
updateDialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:45:06