Android TextView lineCount не возвращает правильное значение, когда установлен ellipsize

#android #xml #android-layout #textview

#Android #xml #android-layout #textview

Вопрос:

Я хочу развернуть и свернуть свой TextView. Поэтому я создал эти функции расширения для этого.

 private const val MAX_LINES_PROPERTY_NAME = "maxLines"
private const val EXPAND_ANIMATION_DURATION = 200L

fun TextView.expand() {
    val animation = ObjectAnimator.ofInt(this, MAX_LINES_PROPERTY_NAME, this.lineCount)
    animation.setDuration(EXPAND_ANIMATION_DURATION).start()
}

fun TextView.collapse(numLines: Int) {
    val animation = ObjectAnimator.ofInt(this, MAX_LINES_PROPERTY_NAME, numLines)
    animation.setDuration(EXPAND_ANIMATION_DURATION).start()
}
  

Проблема возникает, когда я устанавливаю TextView следующим образом

 <TextView
    android:id="@ id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxLines="3"
    android:ellipsize="end"
    android:text="Long text"
    android:textColor="@color/black"
    android:textSize="16sp">
  

По-видимому, TextView.lineCount возвращает 3, когда для ellipsize установлено значение «end». Когда я удаляю эту строку кода, все работает. Кто-нибудь знает, как я могу этого избежать?

Ответ №1:

Я нашел какой-то хакерский способ установить ellipsize и получить lineCount всего TextView.

Во-первых, я удалил android:ellipsize="end" строку в xml.

После этого я сохранил lineCount локально и после этого установил ellipsize программно.

 private var textLineCount = 0

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        textView.post {
                textLineCount = textView.lineCount
                textView.ellipsize = TextUtils.TruncateAt.END
        }
}
  

Теперь, когда у меня есть textLineCount локально, я просто передаю его в свою функцию для расширения TextView, которую я изменил следующим образом

 fun TextView.expand(maxLines: Int? = null) {
    val animation = ObjectAnimator.ofInt(this, MAX_LINES_PROPERTY_NAME, maxLines ?: this.lineCount)
    animation.setDuration(EXPAND_ANIMATION_DURATION).start()
}
  

И это все. Я знаю, что это не самое удачное решение, но оно работает. Если кто-нибудь знает лучше, пожалуйста, поделитесь своим решением.