Поддержка динамического эллипсинга для Android-авторинга TextViews

Новый Autosizing TextViews является довольно устрашающим, но, похоже, отсутствует фундаментальная вещь: эллипсы.

Добавление эллипсов по-прежнему требует определения атрибута maxLines, но если я хочу иметь возможность динамически изменять размер текста в соответствии с границами текстового вида, я также хотел бы иметь возможность динамически добавлять эллипсы, когда это необходимо. Прямо сейчас, если текст не соответствует даже минимальному размеру текста, он просто обрезается.

Как я могу добавить поддержку динамических эллипсов, не отказываясь от новой поддержки автосохранения?

Ответ 1

Лучшее решение, которое я придумала до сих пор, - это программно установить maxLines значение maxLines во время выполнения. Примерно так получится сделать работу:

fun TextView.setMaxLinesForEllipsizing() = doOnPreDraw {
  val numberOfCompletelyVisibleLines = (measuredHeight - paddingTop - paddingBottom) / lineHeight
  maxLines = numberOfCompletelyVisibleLines
}

Имейте в виду, что это зависит от Android KTX (но также может быть легко достигнуто с помощью обычного OnPreDrawListener).

Затем мы можем просто вызвать это расширение из любого TextView мы хотим получить динамический многоточие.

textView.setMaxLinesForEllipsizing()

Если текст изменится, может потребоваться его повторный вызов. Таким образом, также возможно достичь более полного (и сложного) решения, переместив эту логику в пользовательский TextView и, возможно, переопределив там onTextChanged().