首页 > 解决方案 > 设置椭圆大小时,Android TextView lineCount 不返回正确的值

问题描述

我想展开和折叠我的 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">

显然,当 ellipsize 设置为“end”时,textView.lineCount 返回 3。当我删除那行代码时,一切正常。有谁知道我该如何避免这种情况?

标签: androidxmlandroid-layouttextview

解决方案


我找到了一些设置 ellipsize 并获取整个 TextView 的 lineCount 的 hacky 方法。

首先,我删除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()
}

就是这样。我知道这不是最快乐的解决方案,但它确实有效。如果有人知道更好,请分享您的解决方案。


推荐阅读