我有多行 TextViewandroid:ellipsize="end" 设置。我想知道,但是,如果我在那里其实过长(这样,我可以确保完整串表示其他地方页)。

我可以用 TextView.length() 并且找到关于什么的长度的近似的串将适用,但因为它是多条线路, 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。使用下面溶液中的

 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");
           }  
        }
    });

我认为这个问题的最简单的解决方案是将以下代码:

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
                            }
                        }
                    });
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)

它是一些典型情况:

  1. 评论'reviewTextView'
  2. 意见可以倒塌通过一些标准
  3. 如果评论倒塌你显示按钮'readMoreButton'

,它正在为我

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;
     }
    }
   }
  }

真工作,以便,例如,通过充分数据,以从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());
                                    }
                                }
                            });
                        }
                    }
                }
            });

在科特林方式:

textView.post {
   if (textView.lineCount > MAX_LINES_COLLAPSED) {
   // text is not fully displayed
   }
}

实际上视图已经被渲染之后执行View.post()和将运行提供的功能

使用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的绘制并设置行数以及一个标志保存文本视图是否过长或不。文本视图会用正确的行数再次战平,你就会知道它是否ellipsized或不与标志。

您可以再使用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() 视图之前不能调用(布局)集。

scroll top