#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, если вы все еще не получили, пожалуйста, опубликуйте весь свой код файла, и я внесу исправления и отправлю его обратно.