以编程方式更改 inputType 后,EditText 允许任何操作

EditText allows anything after changing inputType programmatically

我有一个只接受数字的 editText。 我有 4 种类型:日期、年份、数学、琐事。 我使用复选框在这些类型之间切换。

InputType 变化如下:

默认情况下,输入类型设置为知识问答,我只能输入数字,但当我至少在我的类型之间切换一次时,我可以输入任何内容。它仅适用于 Date 类型。

处理这一切的监听器:

rgType.setOnCheckedChangeListener { _, checkedId ->
        val checked = findViewById<RadioButton>(checkedId)
        numType = when (checked.text) {
            "Year" -> NumType.YEAR
            "Date" -> NumType.DATE
            "Math" -> NumType.MATH
            else -> NumType.TRIVIA
        }

        tNumber.setText("")
        tAnswer.text = ""
        when (numType) {
            NumType.DATE -> {
                tNumber.hint = "CHOOSE A DATE"
                tNumber.inputType = InputType.TYPE_NULL
                tNumber.hideKeyboard()
            }
            NumType.YEAR -> {
                tNumber.hint = "TYPE A YEAR"
                tNumber.inputType = InputType.TYPE_NUMBER_FLAG_SIGNED
                tNumber.hideKeyboard()
            }
            else -> {
                tNumber.hint = "TYPE A NUMBER"
                tNumber.inputType = InputType.TYPE_NUMBER_FLAG_SIGNED
                tNumber.hideKeyboard()
            }
        }
        Log.d("Input", tNumber.inputType.toString())
    }

**更新代码:**

rgType.setOnCheckedChangeListener { _, checkedId ->
        val checked = findViewById<RadioButton>(checkedId)
        numType = when (checked.text) {
            "Year" -> NumType.YEAR
            "Date" -> NumType.DATE
            "Math" -> NumType.MATH
            else -> NumType.TRIVIA
        }

        tNumber.setText("")
        tAnswer.text = ""
        when (numType) {
            NumType.DATE -> {
                tNumber.hint = "CHOOSE A DATE"
                tNumber.inputType = InputType.TYPE_NULL
                tNumber.hideKeyboard()
            }
            NumType.YEAR -> {
                tNumber.hint = "TYPE A YEAR"
                tNumber.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_SIGNED
                tNumber.hideKeyboard()
            }
            else -> {
                tNumber.hint = "TYPE A NUMBER"
                tNumber.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_SIGNED
                tNumber.hideKeyboard()
            }
        }
        Log.d("Input", tNumber.inputType.toString())
    }

只有4种输入类型:

InputType.TYPE_CLASS_DATETIME
InputType.TYPE_CLASS_NUMBER
InputType.TYPE_CLASS_PHONE
InputType.TYPE_CLASS_TEXT

其他都是flag。如果要设置标志,则必须使用 or 运算符。 示例:

tNumber.inputType = InputType.TYPE_CLASS_DATETIME or InputType.TYPE_DATETIME_VARIATION_DATE

tNumber.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS or InputType.TYPE_TEXT_FLAG_MULTI_LINE