如何实现Android TextView省略文本时不显示省略号且不截断整个末尾单词
实现方案
原生 TextView 自带的 ellipsize 配置项没有匹配你需求的选项,你可以通过自定义文本测量逻辑实现效果,步骤如下:
- 先修改布局配置,关闭系统自带的截断逻辑:
<androidx.appcompat.widget.AppCompatTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="4dp" android:orientation="vertical" android:maxLines="1" android:ellipsize="none" />
- 给 TextView 加自定义文本截断逻辑,以下是 Kotlin 实现的扩展函数,使用时直接调用
tv_id.adjustTextWithoutEllipsis("你要设置的文本")即可:
fun TextView.adjustTextWithoutEllipsis(rawText: String) { post { // 计算 TextView 可用的文本显示宽度 val availableWidth = width - paddingLeft - paddingRight if (availableWidth <= 0) { text = rawText return@post } val textPaint = paint val fullTextWidth = textPaint.measureText(rawText) // 文本长度未超出直接设置 if (fullTextWidth <= availableWidth) { text = rawText return@post } // 从末尾逐字符截断直到符合宽度要求 var tempText = rawText var currentWidth = fullTextWidth while (currentWidth > availableWidth && tempText.length > 1) { tempText = tempText.dropLast(1) currentWidth = textPaint.measureText(tempText) } text = tempText } }
注意事项
- 如果文本包含 emoji、多字节特殊字符或多语言内容,可以将逐字符截断的逻辑替换为按 Unicode 码点截断,避免出现乱码
- 如果使用了自定义字体、行间距、字间距配置,确保测量用的 Paint 和 TextView 实际绘制用的 Paint 参数一致,避免出现测量误差
- 如果你需要所有同类型 TextView 都复用这个逻辑,可以直接继承
AppCompatTextView重写setText方法,自动触发截断逻辑,不需要每次调用扩展函数
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

