Странное поведение текстового поля при настройке максимальной длины текста

#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. Похоже, это связано с типом устройства. Я попытался запустить его на эмуляторе, и он работал нормально.

Ответ №2:

Я заметил, что эта ошибка не возникает на Android 12, где на 11 и ниже она возникает.

К счастью, согласно Google Issue Tracker, это была ошибка текстового поля, которая уже исправлена в Jetpack Compose 1.2.0-alpha04 .

Смотрите Связанные разделы здесь и здесь.