如何获取未在多行 TextView 中截断的部分字符串。例如,如果我有“这是一些你看到的很长的文本”并且 TextView 会显示“这是一些文本......”那么我想将第二个字符串放入某个变量中。最简单的方法是什么?
问问题
3747 次
2 回答
13
您应该能够通过自己有效地计算椭圆字符串来获得它,如下所示:
String ellipsised = TextUtils.ellipsize(textView.getText(),
textView.getPaint(),
(float)textView.getWidth(),
TextUtils.TruncateAt.END).toString();
这可能不是最好的方法,但它应该有效。 ellipsize
方法没有很好地记录,所以我不确定它期望什么作为可用的宽度参数(float),但是通过一些源代码看起来它似乎是文本视图的宽度。
更新:刚刚测试了这段代码。当椭圆截断在一行中时,它可以完美地工作。如果您maxLines
在原始文本视图中指定,则需要其他一些技巧。
更新2:经过一番努力,我设法编写了一种方法来从多行包装的文本视图中获取精确的省略文本。它要复杂得多,但确实会产生正确的结果。
private String getEllipsisedText(TextView textView) {
String text = textView.getText().toString();
int lines = textView.getLineCount();
int width = textView.getWidth();
int len = text.length();
TextUtils.TruncateAt where = TextUtils.TruncateAt.END;
TextPaint paint = textView.getPaint();
StringBuffer result = new StringBuffer();
int spos = 0, cnt, tmp, hasLines = 0;
while(hasLines < lines - 1) {
cnt = paint.breakText(text, spos, len, true, width, null);
if(cnt >= len - spos) {
result.append(text.substring(spos));
break;
}
tmp = text.lastIndexOf('\n', spos + cnt - 1);
if(tmp >= 0 && tmp < spos + cnt) {
result.append(text.substring(spos, tmp + 1));
spos += tmp + 1;
}
else {
tmp = text.lastIndexOf(' ', spos + cnt - 1);
if(tmp >= spos) {
result.append(text.substring(spos, tmp + 1));
spos += tmp + 1;
}
else {
result.append(text.substring(spos, cnt));
spos += cnt;
}
}
hasLines++;
}
if(spos < len) {
result.append(TextUtils.ellipsize(text.subSequence(spos, len), paint, (float)width, where));
}
return result.toString();
}
请注意,此代码假定省略号位于末尾。ellipsize
修改它以适应其他选项应该不会太难。
于 2013-08-22T13:52:02.220 回答
2
原始字符串:
String mVeryLongString = "abcd dfjdsfjdslf jsdlkfjkdf jkdsfj ksdf jkdfjdkf jkfdjfkd fdkjfdkjf dkjfkdjfk dkjfjdkf dkjfkdjfkdj";
截断部分:
String mTruncatedPart = (String) tvLongName.getText().subSequence(tvLongName.getLayout().getEllipsisStart(0), tvLongName.getText().length());
注意:
使用您的文本视图的名称而不是tvLongName
我希望它会有所帮助!
于 2013-08-22T13:45:54.460 回答