在 addTextChangedListener 上将 editText 文本设置为大写,使应用程序挂起

Set editText text to upper case on addTextChangedListener making app hang

即使用户在 edittext 中写的是小写字母,我也想将其设为大写字母。因此我将 ediText 文本设置为 addTextChangedListener 中的大写字母,如下所示。

  editText.addTextChangedListener(object : TextWatcher{
            override fun beforeTextChanged(s : CharSequence?, start : Int, count : Int, after : Int) {
            }

            override fun onTextChanged(s : CharSequence?, start : Int, before : Int, count : Int) {
                    editText.setText(s.toString().toUpperCase())
            }

            override fun afterTextChanged(s : Editable?) {

            }
    })

但是当我在 editText 中输入内容时执行此操作时,应用程序挂起,我必须终止该应用程序并重新启动它 again.As 我想在绑定适配器中使用它我无法使用xml

的 AllCaps 方法

您需要在编辑 EditText 的文本之前删除 textwatcher 并在更改完成后重新添加它。

    val watcher: TextWatcher = object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {

        }

        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
            editText.removeTextChangedListener(this)
            editText.setText(s.toString().toUpperCase())
            editText.addTextChangedListener(this)
        }

        override fun afterTextChanged(s: Editable) {}
    }

    editText.addTextChangedListener(watcher)

您可以在 xml 中或以编程方式使用输入类型。

editText.inputType == InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS

在你的xml你可以放

android:inputType="textCapCharacters"

此解决方案会自动将输入转为大写