#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()
}
И это все. Я знаю, что это не самое удачное решение, но оно работает. Если кто-нибудь знает лучше, пожалуйста, поделитесь своим решением.