#android #kotlin #android-jetpack-compose #android-jetpack-compose-text
Вопрос:
Я пытаюсь установить ограничение на максимальное количество символов в текстовом поле. Это то, что я пробовал:
var text by remember { mutableStateOf("") }
val maxLength = 40
TextField(
value = text,
onValueChange = {
text = it.take(maxLength)
}
)
Вот в чем проблема:
- Когда я превышаю лимит, весь текст внезапно очищается.
- Это происходит только один раз, т.Е. Когда я перепечатываю и превышаю лимит, он просто останавливается там (что является желаемым поведением)
- 40 здесь кажется магическим числом, потому что для maxLength = 39 или ниже все работает нормально. Когда я устанавливаю ограничение на 40 или выше, я вижу это странное поведение. (Это магическое число, похоже, не зависит от ширины текстового поля, поскольку я экспериментировал как с портретным, так и с альбомным режимом, и результат был одинаковым)
Как избавиться от этого поведения? Как правильно установить максимальную длину для текста текстового поля?
Комментарии:
1. Для меня ваш код работает нормально. Вероятно, вы столкнулись с ошибкой Compose, сообщите об этом в Compose issue tracker, указав версию Android, которую вы используете, версию Compose и модель устройства.
2. Похоже, что здесь так и есть. Я попробовал этот код на своем эмуляторе, и там он работал нормально.
Ответ №1:
Вы не должны использовать take() для ограничения количества строк.
take() означает только первое число строк.
Вы можете рассмотреть саму строку и просто оценить количество строк, чтобы оно не превышало 40.
var text by remember { mutableStateOf("") }
val maxLength = 40
TextField(
value = text,
onValueChange = {
if (it.length <= 40)
text = it
}
)
Комментарии:
1. Это тоже не работает. Показывает то же поведение.
2. Как выглядит результирующее поведение?
3. То же, что и в прикрепленном gif.
4. Это может быть связано с высотой и шириной, я не уверен в этом.
5. Похоже, это связано с типом устройства. Я попытался запустить его на эмуляторе, и он работал нормально.