Android TextView文本截断时保留结尾引号的实现方法
解决TextView带引号文本截断时的省略号显示问题
这个坑我之前踩过!默认的TextView截断逻辑只会单纯按字符长度切割,完全不管文本里的引号配对,才会出现开头引号留着、结尾引号被砍掉的尴尬情况。下面给你两种实用的解决思路:
方法一:自定义TextView(推荐,一劳永逸)
写个继承自TextView的自定义控件,手动处理截断逻辑,确保闭合引号和省略号能一起正常显示。核心思路是:
- 计算TextView能容纳的最大显示宽度
- 识别首尾带引号的文本,单独处理内容部分的截断
- 把截断后的内容重新拼接成
"[截取内容]..."的格式
给你一段简化版的示例代码:
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
相关产品推荐
相关产品推荐

