Как устранить ошибку при вводе в поле редактируемого текста?

#android #kotlin #button #android-edittext

Вопрос:

У меня есть поле EditText, завернутое в TextInputLayout. Если вы нажмете кнопку Сохранить, то эта кнопка проверяет, заполнено ли поле: если да, то все в порядке, если нет, то появляется ошибка. Если я введу данные после появления ошибки, то мне нужно снова нажать кнопку Сохранить, чтобы проверка на полноту прошла снова, и только тогда ошибка исчезнет. Как я могу сделать так, чтобы ошибка исчезла, как только я начну вводить данные в поле, и не исчезала только при повторном нажатии кнопки?

 private fun checkStateTitleLayout() {
        val titleLayout = findViewById<TextInputLayout>(R.id.editTitleLayout)
        val checkTitleLayoutState = titleLayout.editText?.text?.toString()
        val fieldIsRequired = getString(R.string.fieldIsRequired)
        when {
            checkTitleLayoutState!!.isEmpty() -> {
                titleLayout.error = fieldIsRequired
            }
            else -> {
                titleLayout.error = null
                titleLayout.isErrorEnabled = false
            }
        }
    }
 

отредактированный:

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_new_item)

        val saveButton = findViewById<Button>(R.id.saveButton)
        val titleLayout = findViewById<TextInputLayout>(R.id.editTitleLayout)
        titleLayout.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) {}
            override fun afterTextChanged(s: Editable?) {
                titleLayout.error = null
                titleLayout.isErrorEnabled = false
            }
        })

        saveButton.setOnClickListener {
            checkStateTitleLayout()
        }
}

private fun checkStateTitleLayout() {
        val titleLayout = findViewById<TextInputLayout>(R.id.editTitleLayout)
        val checkTitleLayoutState = titleLayout.editText?.text?.toString()
        val fieldIsRequired = getString(R.string.fieldIsRequired)

        if (checkTitleLayoutState!!.isEmpty()) titleLayout.error = fieldIsRequired
    }
 

Ответ №1:

Одним из способов было бы использовать TextWatcher это EditText . При любом изменении текста будет запущена соответствующая функция, которая устранит ошибку.

 val titleLayout = findViewById<TextInputLayout>(R.id.editTitleLayout)
titleLayout.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) {}
    override fun afterTextChanged(s: Editable?) {
        titleLayout.error = null
    }
})
 

Мы используем только afterTextChanged() потому, что в этом случае требуется только это. Использование этого позволит вашему приложению работать так, как ожидалось.

Комментарии:

1. Что — то не так, потому что моя область полностью свободна от ошибок. Когда я нажимаю на кнопку Сохранить, я не получаю подтверждения, ничего не происходит, даже ошибка не появляется, когда поле пустое. И если я поставлю строку titleLayout.error = fieldIsRequired раньше addTextChangedListener , то эта ошибка будет срабатывать при каждом нажатии на нее. Что вы можете посоветовать?

2. @Anderson Подожди минутку, куда ты положил код, на который я ответил? Не помещайте это в checkStateTitleLayout() функцию. Поставьте его после кода, где все это TextEdit и Buttons инициализировано. Это сработает как заклинание.

3. @Anderson, если вы все еще не получили, пожалуйста, опубликуйте весь свой код файла, и я внесу исправления и отправлю его обратно.