【问题标题】:EditText allows anything after changing inputType programmaticallyEditText 允许在以编程方式更改 inputType 后进行任何操作
【发布时间】:2021-02-07 21:50:45
【问题描述】:

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

InputType 变化如下:

  • 日期:null(用户将点击editText选择日期)年份,
  • 数学,琐事:signed_number

默认情况下,输入类型设置为琐事,我只能输入数字,但是当我在我的类型之间切换至少一次时,我可以输入任何内容。它仅适用于 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())
    }

【问题讨论】:

    标签: android kotlin android-edittext


    【解决方案1】:

    只有 4 种输入类型:

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

    所有其他都是标志。如果要设置标志,则必须使用 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
    

    【讨论】:

    • 它有效,谢谢。但是如何设置没有输入的呢?
    • InputType.TYPE_NULL 也是有效类型
    • 有个奇怪的bug,虽然是null,但有时可以在editText里写。
    • 你能告诉重现错误的步骤吗?
    • 试试这个isFocusable = false 并让它再次聚焦使用isFocusableInTouchMode = true; isFocusable = true
    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 2021-06-04
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多