How do I tell if my textview has been ellipsized?

前端 未结 14 1634
天涯浪人
天涯浪人 2020-11-30 19:31

I have a multi-line TextView that has android:ellipsize=\"end\" set. I would like to know, however, if the string I place in there is actually too

相关标签:
14条回答
  • 2020-11-30 20:04

    textView.getLayout is the way to go but the problem with that is that it returns null if layout is not prepared. Use the below solution.

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

    Code snippet for removing the listener (source):

    mLayout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            scrollToGridPos(getCenterPoint(), false);
            mLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);        
        }
    });
    
    0 讨论(0)
  • 2020-11-30 20:05

    Using getEllipsisCount won't work with text that has empty lines within it. I used the following code to make it work :

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

    Make sure not to set a maxLineCount in your XML. Then you can check for the lineCount in your code and if it is greater than a certain number, you can return false to cancel the drawing of the TextView and set the line count as well as a flag to save whether the text view is too long or not. The text view will draw again with the correct line count and you will know whether its ellipsized or not with the flag.

    You can then use the isEllipsized flag to do whatever you require.

    0 讨论(0)
  • 2020-11-30 20:06

    The Kotlin way:

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

    Actually View.post() is executed after the view has been rendered and will run the function provided

    0 讨论(0)
  • 2020-11-30 20:07

    I think the easiest solution to this question is the following code:

    String text = "some looooong text";
    textView.setText(text);
    boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));
    

    This code assumes that in your XML the TextView set a maxLineCount :)

    0 讨论(0)
  • 2020-11-30 20:07
    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)
    

    It is some typical case:

    1. comment in 'reviewTextView'
    2. comment can collapsed by some criteria
    3. if comment collapsed you show button 'readMoreButton'
    0 讨论(0)
  • 2020-11-30 20:07

    Combining @Thorstenvv awnser with @Tiano fix, here is the Kotlin version :

    val layout = textView.layout ?: return@doOnLayout
    val lines = layout.lineCount
    val hasLine = lines > 0
    val hasEllipsis = ((lines - 1) downTo 0).any { layout.getEllipsisCount(it) > 0 }
    if (hasLine && hasEllipsis) {
        // Text is ellipsized
    }
    
    0 讨论(0)
提交回复
热议问题