如何知道我的文本视图是否已被省略?
我有一个多行的TextView
android:ellipsize="end"
设置。 但是,我想知道,如果我放在那里的string实际上太长了(这样我可以确保完整的string显示在页面的其他地方)。
我可以使用TextView.length()
查找string的大概长度,但是由于它是多行,所以TextView
处理什么时候换行,所以这不会总是起作用。
有任何想法吗?
你可以得到TextView
的布局,并检查每行的省略号。 对于最后的省略号,检查最后一行就足够了,如下所示:
Layout l = textview.getLayout(); if (l != null) { int lines = l.getLineCount(); if (lines > 0) if (l.getEllipsisCount(lines-1) > 0) Log.d(TAG, "Text is ellipsized"); }
这只在布局阶段后才起作用,否则返回的布局将为空,所以请在代码中的适当位置调用它。
textView.getLayout是要走的路,但问题是,如果布局没有准备,它将返回null。 使用下面的解决scheme。
ViewTreeObserver vto = textview.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout l = textview.getLayout(); if ( l != null){ int lines = l.getLineCount(); if ( lines > 0) if ( l.getEllipsisCount(lines-1) > 0) Log.d(TAG, "Text is ellipsized"); } } });
我认为这个问题的最简单的解决scheme是以下代码:
String text = "some looooong text"; textView.setText(text); boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));
这段代码假定在你的XML中,TextView设置了一个maxLineCount
🙂
public int getEllipsisCount(int line) :
返回要省略的字符数,如果不发生省略号,则返回0。
所以,只需打电话:
int lineCount = textview1.getLineCount(); if(textview1.getLayout().getEllipsisCount(lineCount) > 0) { // Do anything here.. }
由于getLayout()不能在布局设置前调用,所以使用:
ViewTreeObserver vto = textview.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout l = textview.getLayout(); if ( l != null){ int lines = l.getLineCount(); if ( lines > 0) if ( l.getEllipsisCount(lines-1) > 0) Log.d(TAG, "Text is ellipsized"); } } });
最后,不要忘记当你需要nomore时删除removeOnGlobalLayoutListener 。
我已经创build了一个自定义的TextView与监听器通知这个问题。 它也修复了多线椭圆问题。 你可以find它张贴在android ellipsize multiline textview
它正在为我工作
if (l != null) { int lines = l.getLineCount(); if (lines > 0) { for (int i = 0; i < lines; i++) { if (l.getEllipsisCount(i) > 0) { ellipsize = true; break; } } } }
在你的TextViewUtils类中创build一个方法
public static boolean isEllipsized(String newValue, String oldValue) { return !((newValue).equals(oldValue)); }
需要时调用此方法,例如:
if (TextViewUtils.isEllipsized(textviewDescription.getLayout().getText().toString(), yourModelObject.getDescription())) holder.viewMore.setVisibility(View.VISIBLE);//show view more option else holder.viewMore.setVisibility(View.GONE);//hide
但textView.getLayout()不能在视图(布局)设置之前调用。
使用getEllipsisCount
将不适用于其中有空行的文本。 我使用下面的代码使其工作:
message.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { if(m.isEllipsized == -1) { Layout l = message.getLayout(); if (message.getLineCount() > 5) { m.isEllipsized = 1; message.setMaxLines(5); return false; } else { m.isEllipsized = 0; } } return true; } });
确保不要在XML中设置maxLineCount
。 然后你可以检查你的代码中的lineCount
,如果它大于某个数字,你可以返回false来取消TextView
的绘制,并设置行数以及一个标志来保存文本视图是否过长或不。 文本视图将再次绘制正确的行数,并且您将知道是否使用该标记进行了椭圆化。
然后,您可以使用isEllipsized
标志来执行您所需的任何操作。