1

I wanted to add "Read More" functionality after a few lines of text. I've referred to this solution provider here

Below is the result of my code:

Before Read More is Clicked:

Before Read More Is Clicked

After Read More is Clicked:

After Read More Is Clicked

There are two problem arises:
1. I wanted to set the max lines to 5 lines, but the "Read More" text dropped down to the 6th line.
2. Before the read more button is clicked the 1st line ends with "xeo" but after the "read more" button is clicked the 1st line ends with "xeoh".

Below is the my code:

    /**
 * Make Text View Resizable
 * @param maxLine Max Line
 * @param expandText Expand Text
 * @param viewMore Is View More
 */
private void makeTextViewResizable(final int maxLine, final String expandText, final boolean viewMore) {
    if (mTextMessageContentText.getTag() == null) {
        mTextMessageContentText.setTag(mTextMessageContentText.getText());
    }

    ViewTreeObserver vto = mTextMessageContentText.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @SuppressWarnings("deprecation")
        @Override
        public void onGlobalLayout() {
            ViewTreeObserver obs = mTextMessageContentText.getViewTreeObserver();
            obs.removeGlobalOnLayoutListener(this);
            if (maxLine == 0) {
                int lineEndIndex = mTextMessageContentText.getLayout().getLineEnd(0);
                String text = mTextMessageContentText.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText;
                mTextMessageContentText.setText(text);
                mTextMessageContentText.setMovementMethod(LinkMovementMethod.getInstance());
                mTextMessageContentText.setText(
                        addClickablePartTextViewResizable(mTextMessageContentText.getText().toString(), maxLine, expandText,
                                viewMore), TextView.BufferType.SPANNABLE);
            } else if (maxLine > 0 && mTextViewLineCount >= maxLine) {
                int lineEndIndex = mTextMessageContentText.getLayout().getLineEnd(maxLine - 1);
                String text = mTextMessageContentText.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText;
                mTextMessageContentText.setText(text);
                mTextMessageContentText.setMovementMethod(LinkMovementMethod.getInstance());
                mTextMessageContentText.setText(addClickablePartTextViewResizable(mTextMessageContentText.getText().toString(), maxLine, expandText,
                        viewMore), TextView.BufferType.SPANNABLE);
            } else {
                int lineEndIndex = mTextMessageContentText.getLayout().getLineEnd(mTextViewLineCount - 1);
                String text = mTextMessageContentText.getText().subSequence(0, lineEndIndex) + " " + expandText;
                mTextMessageContentText.setText(text);
                mTextMessageContentText.setMovementMethod(LinkMovementMethod.getInstance());
                mTextMessageContentText.setText(
                        addClickablePartTextViewResizable(mTextMessageContentText.getText().toString(), lineEndIndex, expandText,
                                viewMore), TextView.BufferType.SPANNABLE);
            }
        }
    });
}

/**
 * Add Clickable Part Text View Resizable
 * @param stringSpanned String Spanned
 * @param maxLine Maximium Line
 * @param spannableText Spannable Text
 * @param viewMore Is View More
 * @return Sapnnable String Builder
 */
private SpannableStringBuilder addClickablePartTextViewResizable(final String stringSpanned, final int maxLine, final String spannableText, final boolean viewMore) {
    String str = stringSpanned.toString();
    SpannableStringBuilder ssb = new SpannableStringBuilder(stringSpanned);

    if (str.contains(spannableText)) {
        ssb.setSpan(new TextViewClickableSpan(ActivityChatMessageInfo.this, false, R.color.primary_text_color){
            @Override
            public void onClick(View widget) {
                if (viewMore) {
                    mTextMessageContentText.setLayoutParams(mTextMessageContentText.getLayoutParams());
                    mTextMessageContentText.setText(mTextMessageContentText.getTag().toString(), TextView.BufferType.SPANNABLE);
                    mTextMessageContentText.invalidate();
                    makeTextViewResizable(-1, "", false);
                } else {
                    mTextMessageContentText.setLayoutParams(mTextMessageContentText.getLayoutParams());
                    mTextMessageContentText.setText(mTextMessageContentText.getTag().toString(), TextView.BufferType.SPANNABLE);
                    mTextMessageContentText.invalidate();
                    makeTextViewResizable(maxLine, getString(R.string.caption_chat_media_slider_read_more), true);
                }
            }
        }, str.indexOf(spannableText), str.indexOf(spannableText) + spannableText.length(), 0);

    }
    return ssb;
}

Please advice.

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
Mei Yi
  • 341
  • 3
  • 14

0 Answers0