3

複数行の TextView で切り捨てられなかった文字列の一部を取得する方法。たとえば、「これはご覧のとおり非常に長いテキストです」があり、TextView に「これは...というテキストです」と表示された場合、その 2 番目の文字列を変数に取得したいと考えています。そうする最も簡単な方法は何ですか?

4

2 に答える 2

13

次のように、省略された文字列を自分で効果的に計算することで、それを取得できるはずです。

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

これは最善の方法ではないかもしれませんが、うまくいくはずです。 ellipsizeメソッドは十分に文書化されていないため、使用可能な幅パラメーター (float) として期待されるものはわかりませんが、ソース コードを調べると、テキスト ビューの幅のようです。

更新:このコードをテストしました。省略された切り捨てが1行にある場合、完全に機能します。元のテキストビューで指定する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 に答える