Añadir "Ver más" al final de textview después de 3 líneas

Quiero agregar funcionalidad "Más" después de tres líneas de texto. El texto contiene la descripción que es más de 10 líneas. Así que hemos decidido añadir "Más" después de tres líneas de texto. Me gusta:

Introduzca aquí la descripción de la imagen

Cuando el texto muestra la descripción completa, debe mostrar el botón "Menos" al final del texto que vuelve a comprimir la vista de texto.

Pruebe esto puede ayudarle a trabajar bien conmigo.

package com.example.demo; import android.app.Activity; import android.os.Bundle; import android.text.Html; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.Menu; import android.view.View; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.widget.TextView; import android.widget.TextView.BufferType; 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() { 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), 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), 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), 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) { if (viewMore) { tv.setLayoutParams(tv.getLayoutParams()); tv.setText(tv.getTag().toString(), BufferType.SPANNABLE); tv.invalidate(); makeTextViewResizable(tv, -1, "View Less", false); } else { tv.setLayoutParams(tv.getLayoutParams()); tv.setText(tv.getTag().toString(), BufferType.SPANNABLE); tv.invalidate(); makeTextViewResizable(tv, 3, "View More", true); } } }, str.indexOf(spanableText), str.indexOf(spanableText) + spanableText.length(), 0); } return ssb; } } 

Actualizar: quitar subline de spaneble texto

1) Crear Custom ClickableSpan

 import android.text.TextPaint; import android.text.style.ClickableSpan; import android.view.View; public class MySpannable extends ClickableSpan { private boolean isUnderline = true; /** * Constructor */ public MySpannable(boolean isUnderline) { this.isUnderline = isUnderline; } @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(isUnderline); } @Override public void onClick(View widget) { } } 

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

Salida:

Introduzca aquí la descripción de la imagen

Introduzca aquí la descripción de la imagen

Aquí está mi texto personalizado simple. En lugar de usar Ver más texto, utiliza Compound Drawable en la parte inferior:

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

Esto romperá la línea si hay \ r \ n o \ n en la cadena

 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; } 
  • Cómo hacer que un TextView parezca un encabezado PreferenciaCategoría de un ajuste
  • El texto en cursiva no funciona en la pestaña Samsung Galaxy
  • Cómo subrayar texto en TextView con un color diferente que el texto?
  • ¿Cómo actualizar el texto del diseño de la cabecera cada segundo en cualquier actividad y mostrar en todas las pantallas?
  • Vínculos con varios clics en TextView en Android
  • Android - Destacar una palabra en un TextView?
  • Más espacio entre líneas en TextView
  • Cómo encontrar texto visible en la vista de texto
  • Alineación derecha del texto en Android TextView
  • Agregar Layout de forma programática dentro de otro
  • Android textview relleno entre líneas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.