android 如何在DialogFragment中显示和隐藏软键盘

k10s72fa  于 2022-11-20  发布在  Android
关注(0)|答案(1)|浏览(459)

我有一个自定义的DialogFragment,其中有一个输入文本,当对话框显示时,我会显示键盘,当按下完成按钮或按下肯定按钮或对话框被关闭以隐藏键盘。
我试着将键盘显示为如下所示:
第一个
并以这种方式隐藏它:
第一次
但是键盘没有显示,如果我把注意力集中在输入上,并试图关闭对话框,键盘仍然保持打开状态。

rqqzpn5f

rqqzpn5f1#

我通过将isCancelable设置为false来解决这个问题,因为我无法在覆盖点击时隐藏键盘。我设法在每个关闭对话框的操作中使用函数hideKeyboard(),所以当它等于IME_ACTION_DONE时,正负按钮和编辑器都可以操作。
为了在显示对话框时显示键盘,我添加了以下代码:

dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

下面是我的DialogFragment的代码:

private fun hideKeyboard() {
    val im: InputMethodManager = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    im.hideSoftInputFromWindow(quantity.windowToken, 0)
}

private lateinit var quantity: EditText

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return activity?.let {
        val builder = AlertDialog.Builder(requireContext())
        val view = layoutInflater.inflate(R.layout.dialog_quantity_input, null)

        isCancelable = false
        quantity = view.findViewById(R.id.quantity)

        builder.setView(view)

        viewModel.selectedProduct.value.let {
            quantity.setText(it?.quantity.toString())
        }

        builder.setTitle("Modifica quantità")

        builder.setPositiveButton("Conferma") { _, _ ->
            ...
            hideKeyboard()
        }

        builder.setNegativeButton("Annulla") { _, _ ->
            hideKeyboard()
        }

        quantity.setOnEditorActionListener { v, actionId, _ ->
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                ...
                hideKeyboard()
                dismiss()
            }
            false
        }

        quantity.requestFocus()

        val dialog = builder.create()
        dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

        return dialog
    } ?: throw IllegalStateException("Activity cannot be null")
}

相关问题