获取未被ellipsize截断的String的一部分

abc*_*abc 3 android

如何获取未在多行TextView中截断的String的一部分.例如,如果我有"这是一些文本,你看到的很长",TextView会显示"这是一些文本......"然后我想把第二个字符串变成一些变量.最简单的方法是什么?

Ale*_*s G 11

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

String ellipsised = TextUtils.ellipsize(textView.getText(),
                                        textView.getPaint(),
                                        (float)textView.getWidth(),
                                        TextUtils.TruncateAt.END).toString();
Run Code Online (Sandbox Code Playgroud)

这可能不是最好的方法,但应该有效. ellipsize方法没有很好地记录,所以我不确定它作为可用的宽度参数(浮点数)的期望,但查看一些源代码,它似乎是文本视图的宽度.

更新:刚刚测试了这段代码.当省略号截断在一行中时,它完美地工作.如果您maxLines在原始文本视图中指定,则需要其他一些黑客.

更新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();
}
Run Code Online (Sandbox Code Playgroud)

请注意,此代码假定省略号位于末尾.修改它以满足其他ellipsize选项应该不会太困难.