You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中TextView多行文本省略功能失效如何解决?

Android TextView多行文本省略失效的解决方案

在Android开发中,设置TextView多行文本省略时可能出现功能失效的情况,比如以下布局示例中,即便指定了maxLines="2",但ellipsize="none"导致无法自动触发多行省略,需要手动实现该效果:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/spinner_item_text_view"
    style="@style/ControllerWidget.TextView.SpinnerDropDownItem"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="none"
    android:gravity="center_vertical"
    android:maxLines="2"
    android:singleLine="false" />

解决方案思路

通过计算TextView的实际可用宽度、文本总宽度,得出文本实际占用行数,再调用TextUtils.ellipsize方法生成不会溢出的省略后字符串,具体实现如下:

fun ellipsize(
    textView: TextView,
    originText: CharSequence,
    maxLines: Int,
    truncateAt: TruncateAt
): CharSequence {
    // 计算左右drawable占用的宽度(上下drawable不影响水平宽度)
    val compoundDrawables = textView.compoundDrawables
    var compoundWidth = 0
    if (compoundDrawables.isNotEmpty()) {
        compoundDrawables[0]?.let {
            compoundWidth += textView.compoundDrawablePadding + it.intrinsicWidth
        }
        if (compoundDrawables.size > 2) {
            compoundDrawables[2]?.let {
                compoundWidth += textView.compoundDrawablePadding + it.intrinsicWidth
            }
        }
    }
    // 计算文本可使用的宽度
    val availableWidth =
        textView.width - textView.paddingEnd - textView.paddingStart - compoundWidth
    val textWidth = getMeasureText(textView, originText.toString())
    // 计算文本实际占用的行数
    val occupiedLines = (textWidth + availableWidth - 1).toInt() / availableWidth

    if (occupiedLines > 1) {
        // 取实际行数和最大行数的较小值
        val resolvedLines = min(occupiedLines, maxLines)
        return TextUtils.ellipsize(
            originText,
            textView.paint,
            min(availableWidth * resolvedLines.toFloat(), textWidth),
            truncateAt
        )
    }
    return originText
}

private fun getMeasureText(textView: TextView, text: String): Float {
    return textView.paint.measureText(text)
}

使用说明

调用该方法时,传入目标TextView、原始文本、最大行数(如布局中的2行)以及省略位置(如TruncateAt.END),将返回值设置给TextView即可实现多行省略效果。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:15:55