0

I need to determine if textview contains 3 lines or more text. If textview contains more than 3 lines i should show read more button.

This is code I use for it:

  ViewTreeObserver vto = txtContent.getViewTreeObserver();
  vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      ViewTreeObserver obs = txtContent.getViewTreeObserver();
      obs.removeGlobalOnLayoutListener(this);

      int lineCount = txtContent.getLineCount();

      if (lineCount > 3) {
        txtReadMore.setVisibility(View.VISIBLE);
      } else {
        txtReadMore.setVisibility(View.GONE);
      }
    }
  });

When txtContent text is Test\n\nHhj:

"Test

Hhj"

I get line count 3, although number should be 4 (it has two times return).

Is there a way to get correct number, or maybe i should change something in my code?

Zoran
  • 1,484
  • 1
  • 10
  • 13

3 Answers3

1

Test\n\nHhj is 3 lines :)

Test = 1 line
Test\n = 2 lines
Test\n\n = 3 lines
Test\n\nHhj = 3 lines

1. Test
2. 
3. Hhj
Kevin Robatel
  • 8,025
  • 3
  • 44
  • 57
1

Thanks all for contributing but reason for this "bug" is i didn't realize that in xml txtContent has set android:maxLines="3".

If max lines is set and textview has more lines, getLineCount returns number of max lines. After deleting this line, getLineCount returns 4 in my case.

Sorry for this mess.

Zoran
  • 1,484
  • 1
  • 10
  • 13
0

Showing Show more/Show less If textview containing more than 3 lines.

Step 1) Set your text on textview and call below methods

tvTitle.setText("any text");
if(tvTitle.getLineCount()>3)
   makeTextViewResizable(tvTitle, 3, ".. Read More", true);

Step 2) Add two methods given below

 public static void makeTextViewResizable(final TextView tv, final int maxLine, final String expandText, final boolean viewMore) {

        if (tv.getTag() == null) {
            tv.setTag(tv.getText());
        }
        ViewTreeObserver vto = tv.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            @SuppressWarnings("deprecation")
            @Override
            public void onGlobalLayout() {

                ViewTreeObserver obs = tv.getViewTreeObserver();
                obs.removeGlobalOnLayoutListener(this);
                if (maxLine == 0) {
                    int lineEndIndex = tv.getLayout().getLineEnd(0);
                    String text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText;
                    tv.setText(text);
                    tv.setMovementMethod(LinkMovementMethod.getInstance());
                    tv.setText(
                            addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, maxLine, expandText,
                                    viewMore), TextView.BufferType.SPANNABLE);
                }
                else if (maxLine > 0 && tv.getLineCount() >= maxLine) {
                    int lineEndIndex = tv.getLayout().getLineEnd(maxLine - 1);
                    String text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText;
                    tv.setText(text);
                    tv.setMovementMethod(LinkMovementMethod.getInstance());
                    tv.setText(
                            addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, maxLine, expandText,
                                    viewMore), TextView.BufferType.SPANNABLE);
                } else {
                    int lineEndIndex = tv.getLayout().getLineEnd(tv.getLayout().getLineCount() - 1);
                    String text = tv.getText().subSequence(0, lineEndIndex) + " " + expandText;
                    tv.setText(text);
                    tv.setMovementMethod(LinkMovementMethod.getInstance());
                    tv.setText(
                            addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, lineEndIndex, expandText,
                                    viewMore), TextView.BufferType.SPANNABLE);
                }
            }
        });

    }

    private static SpannableStringBuilder addClickablePartTextViewResizable(final Spanned strSpanned, final TextView tv,
                                                                            final int maxLine, final String spanableText, final boolean viewMore) {
        String str = strSpanned.toString();
        SpannableStringBuilder ssb = new SpannableStringBuilder(strSpanned);

        if (str.contains(spanableText)) {


            ssb.setSpan(new MySpannable(false) {
                @Override
                public void onClick(View widget) {
                    if (viewMore) {
                        tv.setLayoutParams(tv.getLayoutParams());
                        tv.setText(tv.getTag().toString(), TextView.BufferType.SPANNABLE);
                        tv.invalidate();
                        makeTextViewResizable(tv, -1, ".. Show Less", false);
                    } else {
                        tv.setLayoutParams(tv.getLayoutParams());
                        tv.setText(tv.getTag().toString(), TextView.BufferType.SPANNABLE);
                        tv.invalidate();
                        makeTextViewResizable(tv, 2, ".. Show More", true);
                    }
                }
            }, str.indexOf(spanableText), str.indexOf(spanableText) + spanableText.length(), 0);

        }
        return ssb;

    }

Hope it would work for you. Let me know If you find any query. I Inspired from https://stackoverflow.com/a/30636164/7727011

brijexecon
  • 533
  • 4
  • 13