gpt4 book ai didi

android - 获取未被 ellipsize 截断的字符串的一部分

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:28 27 4
gpt4 key购买 nike

如何获取在多行 TextView 中未被截断的字符串部分。例如,如果我有“这是一些如您所见相当长的文本”,而 TextView 会显示“这是一些文本……”,那么我想将第二个字符串放入某个变量中。最简单的方法是什么?

最佳答案

您应该能够通过有效地自己计算省略号字符串来获得它,如下所示:

String ellipsised = TextUtils.ellipsize(textView.getText(),
textView.getPaint(),
(float)textView.getWidth(),
TextUtils.TruncateAt.END).toString();

这可能不是最好的方法,但应该可行。 ellipsize 方法没有很好地记录,所以我不确定它期望什么作为 available width 参数(float),但通过一些源代码看起来似乎它是 TextView 的宽度。

更新:刚刚测试了这段代码。当省略号截断在一行中时,它可以完美地工作。如果您在原始 TextView 上指定 maxLines,则需要一些其他 hack。

更新 2: 经过一番努力,我设法编写了一种方法来从多行换行 TextView 中获取精确的省略号文本。它要复杂得多,但它确实会产生正确的结果。

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 选项应该不会太难。

关于android - 获取未被 ellipsize 截断的字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18381990/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com