Показать "Читать дальше" в конце текста не работает правильно - PullRequest
0 голосов
/ 08 февраля 2019

Я хотел добавить функциональность «Подробнее» после нескольких строк текста.Я упомянул этого поставщика решений здесь

Ниже приведен результат моего кода:

Прежде чем нажать кнопку Подробнее:

Before Read More Is Clicked

После нажатия кнопки «Подробнее» нажимается:

After Read More Is Clicked

Возникают две проблемы:1. Я хотел установить максимум 5 строк, но текст «Подробнее» опустился до 6-й строки.2. Перед нажатием кнопки «Читать далее» 1-я строка заканчивается «xeo», но после нажатия кнопки «Читать далее» 1-я строка заканчивается «xeoh».

Ниже приведен мой код:

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

Пожалуйста, совет.

Спасибо.

...