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

Android TextView文本截断时保留结尾引号的实现方法

解决TextView带引号文本截断时的省略号显示问题

这个坑我之前踩过!默认的TextView截断逻辑只会单纯按字符长度切割,完全不管文本里的引号配对,才会出现开头引号留着、结尾引号被砍掉的尴尬情况。下面给你两种实用的解决思路:

方法一:自定义TextView(推荐,一劳永逸)

写个继承自TextView的自定义控件,手动处理截断逻辑,确保闭合引号和省略号能一起正常显示。核心思路是:

  1. 计算TextView能容纳的最大显示宽度
  2. 识别首尾带引号的文本,单独处理内容部分的截断
  3. 把截断后的内容重新拼接成"[截取内容]..."的格式

给你一段简化版的示例代码:

public class QuotedTextView extends AppCompatTextView {
    public QuotedTextView(Context context) {
        super(context);
    }

    public QuotedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (getMaxLines() != 1) return;

        CharSequence originalText = getText();
        if (originalText == null || originalText.length() < 2) return;

        // 判断是否是首尾带英文引号的文本
        if (originalText.charAt(0) == '"' && originalText.charAt(originalText.length() - 1) == '"') {
            String content = originalText.subSequence(1, originalText.length() - 1).toString();
            TextPaint paint = getPaint();
            // 计算可用宽度:控件总宽度减去左右内边距
            float availableWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
            // 计算结尾"..."的宽度
            float suffixWidth = paint.measureText("...\"");
            // 内容部分能占用的最大宽度
            float maxContentWidth = availableWidth - suffixWidth;

            // 截断内容部分
            CharSequence truncatedContent = TextUtils.ellipsize(content, paint, maxContentWidth, TextUtils.TruncateAt.END);
            // 重新拼接成带引号的完整文本
            setText("\"" + truncatedContent + "...\"");
        }
    }
}

之后在布局里用这个自定义控件替换普通TextView,记得保留android:maxLines="1"属性就行。如果用的是中文引号“”,把代码里的"换成“和”即可。

方法二:提前在代码中手动处理文本

如果只是单个TextView需要处理,不想自定义控件,也可以在设置文本前手动计算处理:

TextView textView = findViewById(R.id.your_text_view);
String originalText = "\"hello world one two three four\"";

if (originalText.startsWith("\"") && originalText.endsWith("\"")) {
    String content = originalText.substring(1, originalText.length() - 1);
    TextPaint paint = textView.getPaint();
    // 确保先获取到控件的实际宽度
    textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    float availableWidth = textView.getMeasuredWidth() - textView.getPaddingLeft() - textView.getPaddingRight();
    float suffixWidth = paint.measureText("...\"");
    float maxContentWidth = availableWidth - suffixWidth;

    CharSequence truncatedContent = TextUtils.ellipsize(content, paint, maxContentWidth, TextUtils.TruncateAt.END);
    textView.setText("\"" + truncatedContent + "...\"");
} else {
    textView.setText(originalText);
}

注意:如果TextView的宽度是wrap_content,需要先调用measure方法获取实际宽度再处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:42:08