Добавьте «Просмотреть больше» в конце текстового просмотра после трех строк

Я хочу добавить функциональность «Дополнительно» после трех строк текста. Текст содержит описание, которое содержит более 10 строк. поэтому мы решили добавить «Больше» после трех строк текста. Подобно:

введите описание изображения здесь

когда текст показывает полное описание, тогда он должен показать кнопку «Меньше» в конце текста, которая снова сжимает текстовое изображение.

Попытайтесь, это может помочь вам нормально работать со мной.

public class MainActivity extends Activity { TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); makeTextViewResizable(tv, 3, "View More", true); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } 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 OnGlobalLayoutListener() { @SuppressWarnings("deprecation") @Override public void onGlobalLayout() { String text; int lineEndIndex; ViewTreeObserver obs = tv.getViewTreeObserver(); obs.removeGlobalOnLayoutListener(this); if (maxLine == 0) { lineEndIndex = tv.getLayout().getLineEnd(0); text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText; } else if (maxLine > 0 && tv.getLineCount() >= maxLine) { lineEndIndex = tv.getLayout().getLineEnd(maxLine - 1); text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText; } else { lineEndIndex = tv.getLayout().getLineEnd(tv.getLayout().getLineCount() - 1); 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), 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 ClickableSpan() { @Override public void onClick(View widget) { tv.setLayoutParams(tv.getLayoutParams()); tv.setText(tv.getTag().toString(), BufferType.SPANNABLE); tv.invalidate(); if (viewMore) { makeTextViewResizable(tv, -1, "View Less", false); } else { makeTextViewResizable(tv, 3, "View More", true); } } }, str.indexOf(spanableText), str.indexOf(spanableText) + spanableText.length(), 0); } return ssb; } } 

UPDATE: удалить UnderLine из текста spaneble

1) Создать пользовательский ClickableSpan

 public class MySpannable extends ClickableSpan { private boolean isUnderline = false; /** * Constructor */ public MySpannable(boolean isUnderline) { this.isUnderline = isUnderline; } @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(isUnderline); ds.setColor(Color.parseColor("#343434")); } @Override public void onClick(View widget) { } } 

2) Изменение addClickablePartTextViewResizable()

 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) { tv.setLayoutParams(tv.getLayoutParams()); tv.setText(tv.getTag().toString(), BufferType.SPANNABLE); tv.invalidate(); if (viewMore) { makeTextViewResizable(tv, -1, "View Less", false); } else { makeTextViewResizable(tv, 3, "View More", true); } } }, str.indexOf(spanableText), str.indexOf(spanableText) + spanableText.length(), 0); } return ssb; } 

Вывод:

введите описание изображения здесь

введите описание изображения здесь

Вот мой простой пользовательский TextView. Вместо этого, используя следующий текст, он использует Compound Drawable внизу:

 public class ExpandableTextView extends TextView implements OnClickListener { private static final int MAX_LINES = 5; private int currentMaxLines = Integer.MAX_VALUE; public ExpandableTextView(Context context) { super(context); setOnClickListener(this); } public ExpandableTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setOnClickListener(this); } public ExpandableTextView(Context context, AttributeSet attrs) { super(context, attrs); setOnClickListener(this); } @Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { /* If text longer than MAX_LINES set DrawableBottom - I'm using '...' icon */ post(new Runnable() { public void run() { if (getLineCount()>MAX_LINES) setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, R.drawable.icon_more_text); else setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); setMaxLines(MAX_LINES); } }); } @Override public void setMaxLines(int maxLines) { currentMaxLines = maxLines; super.setMaxLines(maxLines); } /* Custom method because standard getMaxLines() requires API > 16 */ public int getMyMaxLines() { return currentMaxLines; } @Override public void onClick(View v) { /* Toggle between expanded collapsed states */ if (getMyMaxLines() == Integer.MAX_VALUE) setMaxLines(MAX_LINES); else setMaxLines(Integer.MAX_VALUE); } } 

Это разломит Линию, если в строке есть \ r \ n или \ n

 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 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(tv.getText() .toString(), tv, maxLine, expandText, viewMore), 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(tv.getText() .toString(), tv, maxLine, expandText, viewMore), 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(tv.getText() .toString(), tv, lineEndIndex, expandText, viewMore), BufferType.SPANNABLE); } } }); } private static SpannableStringBuilder addClickablePartTextViewResizable( final String strSpanned, final TextView tv, final int maxLine, final String spanableText, final boolean viewMore) { SpannableStringBuilder ssb = new SpannableStringBuilder(strSpanned); if (strSpanned.contains(spanableText)) { ssb.setSpan( new ClickableSpan() { @Override public void onClick(View widget) { if (viewMore) { tv.setLayoutParams(tv.getLayoutParams()); tv.setText(tv.getTag().toString(), BufferType.SPANNABLE); tv.invalidate(); makeTextViewResizable(tv, -5, "...Read Less", false); tv.setTextColor(Color.BLACK); } else { tv.setLayoutParams(tv.getLayoutParams()); tv.setText(tv.getTag().toString(), BufferType.SPANNABLE); tv.invalidate(); makeTextViewResizable(tv, 5, "...Read More", true); tv.setTextColor(Color.BLACK); } } }, strSpanned.indexOf(spanableText), strSpanned.indexOf(spanableText) + spanableText.length(), 0); } return ssb; } 
Interesting Posts

Как исправить файл R Markdown, например `source (‘myfile.r’)`?

Удалить строки в текстовом файле, который содержит определенную строку

Почему sudo curl игнорирует настройки прокси-сервера?

Получение значения элемента DOM с использованием чистого JavaScript

Почему не вызывает статический метод путем экземпляра ошибки для компилятора Java?

Просмотр заголовков HTTP в Google Chrome?

Есть ли способ интегрировать Eclipse с Gradle в проект Android?

Как использовать jQuery для отображения / скрытия divs на основе выбора переключателя?

Как сравнить все элементы двух массивов?

Почему система прослушивает порт 8000?

Каков наиболее подходящий способ хранения пользовательских настроек в приложении Android

прохождение 2 $ индексных значений внутри вложенного ng-repeat

Как мы обмениваемся файлами с Mac на Windows?

Может ли printf быть заменен автоматически помещается в программу C?

C ++ Object Instantiation

Давайте будем гением компьютера.