我有一个多行TextView已android:ellipsize="end"设定。但是,我想知道我放置的字符串是否太长(这样我可以确保完整的字符串显示在页面的其他位置)。
我可以使用TextView.length()并找到大约适合的字符串长度,但是由于它是多行,所以可以TextView处理何时换行,因此这并不总是可行。
有任何想法吗?
Answers:
您可以获取的布局,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");
}
这仅在布局阶段之后才起作用,否则返回的布局将为null,因此请在代码中的适当位置调用它。
getEllipsisCountAPI <= 14中的函数错误,如果文本包含特殊字符(如\ n),它将失败并返回0。因此,可以通过使用支持库并替换if (l.getEllipsisCount(lines-1) > 0)为来解决此问题if (l.getEllipsisCount(lines-1) > 0 || TextViewCompat.getMaxLines(this))。
                    textView.getLayout是一种解决方法,但是存在的问题是,如果未准备好布局,它将返回null。使用以下解决方案。
 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");
           }  
        }
    });
用于删除侦听器(源)的代码段:
mLayout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    public void onGlobalLayout() {
        scrollToGridPos(getCenterPoint(), false);
        mLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);        
    }
});
    removeOnGlobalLayoutListener()当您不再需要它时,请不要忘记。
                    LayoutgetEllipsisCount
                    我认为这个问题最简单的解决方案是以下代码:
String text = "some looooong text";
textView.setText(text);
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));
此代码假定在您的XML中,TextView设置了maxLineCount:)
这对我有用:
textView.post(new Runnable() {
                        @Override
                        public void run() {
                            if (textView.getLineCount() > 1) {
                                //do something
                            }
                        }
                    });
    public int getEllipsisCount(int行):
返回要省略的字符数,如果没有省略号,则返回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");
       }  
    }
});
最后,不要忘了在不再需要它时删除removeOnGlobalLayoutListener。
lateinit var toggleMoreButton: Runnable
toggleMoreButton = Runnable {
  if(reviewTextView.layout == null) { // wait while layout become available
       reviewTextView.post(toggleMoreButton) 
       return@Runnable
  }
  readMoreButton.visibility = if(reviewTextView.layout.text.toString() != comment) View.VISIBLE else View.GONE
}
reviewTextView.post(toggleMoreButton)
这是一些典型的情况:
简单的Kotlin方法。允许android:ellipsize和android:maxLines被使用
fun isEllipsized(textView: TextView, text: String?) = textView.layout.text.toString() != text
    确实可以这样工作,例如,将完整的数据从RecyclerView的项目传递到对话框:
holder.subInfo.post(new Runnable() {
                @Override
                public void run() {
                    Layout l = holder.subInfo.getLayout();
                    if (l != null) {
                        final int count = l.getLineCount();
                        if (count >= 3) {
                            holder.subInfo.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    final int c = holder.subInfo.getLineCount();
                                    if (c >= 3) {
                                        onClickToShowInfoDialog.showDialog(holder.title.getText().toString(), holder.subInfo.getText().toString());
                                    }
                                }
                            });
                        }
                    }
                }
            });
    在Kotlin中,您可以使用以下代码。
var str= "Kotlin is one of the best languages."
textView.text=str
textView.post {
val isEllipsize: Boolean = !textView.layout.text.toString().equals(str)
if (isEllipsize) {
     holder.itemView.tv_viewMore.visibility = View.VISIBLE
} else {
     holder.itemView.tv_viewMore.visibility = View.GONE
}    
}
    使用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;
        }
    });
确保不要maxLineCount在XML中设置A。然后,您可以lineCount在代码中检查,如果它大于某个数字,则可以返回false来取消绘制TextView并设置行数以及一个标志以保存文本视图是否太长。文本视图将以正确的行数再次绘制,并且您将知道是否带有标记将其椭圆化。
然后,您可以使用该isEllipsized标志执行所需的任何操作。
在TextViewUtils类中创建一个方法
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()不能在设置view(layout)之前调用。