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

如何实现Android TextView省略文本时不显示省略号且不截断整个末尾单词

实现方案

原生 TextView 自带的 ellipsize 配置项没有匹配你需求的选项,你可以通过自定义文本测量逻辑实现效果,步骤如下:

  1. 先修改布局配置,关闭系统自带的截断逻辑:
<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"
/>
  1. 给 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:54:03