如何知道我的文本视图是否已被省略?

我有一个多行的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标志来执行您所需的任何操作。