12

如何将已被 Android 截断的文本变成省略号?

我有一个文本视图:

<TextView
    android:layout_width="120dp"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:singleLine="true"
    android:text="Um longo texto aqui de exemplo" />

在设备上,此 TextView 显示如下:

"Um longo texto a..."

我如何获得其余的文本?

我正在寻找类似getRestOfTruncate()返回“qui de exemplo”的东西。

4

3 回答 3

9
String text = (String) textView.getText().subSequence(textView.getLayout().getEllipsisStart(0), textView.getText().length());
于 2012-06-15T03:21:50.987 回答
1

使用 textView.getLayout().getEllipsisStart(0) 仅适用于 android:singleLine="true"

如果设置了 android:maxLines,这是一个可行的解决方案:

public static String getEllipsisText(TextView textView) {
    // test that we have a textview and it has text
    if (textView==null || TextUtils.isEmpty(textView.getText())) return null;
    Layout l = textView.getLayout();
    if (l!=null) {
        // find the last visible position
        int end = l.getLineEnd(textView.getMaxLines()-1);
        // get only the text after that position
        return textView.getText().toString().substring(end);
    }

    return null;
}

请记住:这在视图已经可见之后才起作用。

用法:

textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            Log.i("test" ,"EllipsisText="+getEllipsisText(textView));
        }
    });
于 2017-11-25T10:48:23.330 回答
1

我的解决方案。Kotlin 扩展功能:

fun TextView.getEllipsizedText(): String {
if (text.isNullOrEmpty()) return ""
return layout?.let {
    val end = textContent.text.length - textContent.layout.getEllipsisCount(maxLines - 1)
    return text.toString().substring(0, end)
} ?: ""
}
于 2018-12-28T07:26:06.967 回答