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

