android textview ellipsis

android - ¿Cómo puedo saber si mi textview ha sido ellipsized?



ellipsis (10)

Creé un TextView personalizado con una notificación de escucha para este mismo problema. También soluciona el problema de la elipse multilínea. Puede encontrarlo publicado en android ellipsize multiline textview

Tengo un TextView que tiene android:ellipsize="end" establecido. Sin embargo, me gustaría saber si la cadena que coloco allí es realmente demasiado larga (para asegurarme de que la cadena completa se muestre en otra parte de la página).

Podría usar TextView.length() y encontrar cuál sería la longitud aproximada de la cadena, pero dado que se trata de varias líneas, TextView encarga de cuándo se TextView , por lo que esto no siempre funcionará.

¿Algunas ideas?


Creo que la solución más fácil para esta pregunta es el siguiente código:

String text = "some looooong text"; textView.setText(text); boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));

Este código asume que en su XML el TextView establece un maxLineCount :)


El uso de getEllipsisCount no funcionará con texto que tenga líneas vacías dentro de él. Usé el siguiente código para que funcione:

message.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { if(m.isEllipsized == -1) { Layout l = message.getLayout(); if (message.getLineCount() > 5) { m.isEllipsized = 1; message.setMaxLines(5); return false; } else { m.isEllipsized = 0; } } return true; } });

Asegúrese de no establecer un maxLineCount en su XML. Luego puede verificar el lineCount en su código y si es mayor que un cierto número, puede devolver false para cancelar el dibujo de TextView y establecer el recuento de líneas, así como una bandera para guardar si la vista de texto es demasiado larga. o no. La vista de texto dibujará nuevamente con el recuento de líneas correcto y sabrá si está elíptica o no con la bandera.

Luego puede usar el indicador isEllipsized para hacer lo que necesite.


Esto funcionó para mí:

textView.post(new Runnable() { @Override public void run() { if (textView.getLineCount() > 1) { //do something } } });


Puede obtener el diseño del TextView y verificar el recuento de puntos suspensivos por línea. Para una elipsis final, es suficiente verificar la última línea, como esta:

Layout l = textview.getLayout(); if (l != null) { int lines = l.getLineCount(); if (lines > 0) if (l.getEllipsisCount(lines-1) > 0) Log.d(TAG, "Text is ellipsized"); }

Esto solo funciona después de la fase de diseño, de lo contrario el diseño devuelto será nulo, así que llámalo a un lugar apropiado en tu código.


Realmente trabaje para, por ejemplo, pasar datos completos al diálogo desde el elemento de RecyclerView:

holder.subInfo.post(new Runnable() { @Override public void run() { Layout l = holder.subInfo.getLayout(); if (l != null) { final int count = l.getLineCount(); if (count >= 3) { holder.subInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final int c = holder.subInfo.getLineCount(); if (c >= 3) { onClickToShowInfoDialog.showDialog(holder.title.getText().toString(), holder.subInfo.getText().toString()); } } }); } } } });


crea un método dentro de tu clase TextViewUtils

public static boolean isEllipsized(String newValue, String oldValue) { return !((newValue).equals(oldValue)); }

llame a este método cuando sea necesario, por ejemplo:

if (TextViewUtils.isEllipsized(textviewDescription.getLayout().getText().toString(), yourModelObject.getDescription())) holder.viewMore.setVisibility(View.VISIBLE);//show view more option else holder.viewMore.setVisibility(View.GONE);//hide

pero textView.getLayout () no puede llamar antes de que se configure la vista (diseño).


me funciona

if (l != null) { int lines = l.getLineCount(); if (lines > 0) { for (int i = 0; i < lines; i++) { if (l.getEllipsisCount(i) > 0) { ellipsize = true; break; } } } }


textView.getLayout es el camino a seguir, pero el problema es que devuelve nulo si el diseño no está preparado. Use la solución a continuación.

ViewTreeObserver vto = textview.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout l = textview.getLayout(); if ( l != null){ int lines = l.getLineCount(); if ( lines > 0) if ( l.getEllipsisCount(lines-1) > 0) Log.d(TAG, "Text is ellipsized"); } } });


public int getEllipsisCount (línea int) :

Devuelve la cantidad de caracteres que se van a elipsar, o 0 si no se realizarán puntos suspensivos.

Entonces, simplemente llame:

int lineCount = textview1.getLineCount(); if(textview1.getLayout().getEllipsisCount(lineCount) > 0) { // Do anything here.. }

Como getLayout () no se puede llamar antes de que se establezca el diseño, utilice esto:

ViewTreeObserver vto = textview.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout l = textview.getLayout(); if ( l != null){ int lines = l.getLineCount(); if ( lines > 0) if ( l.getEllipsisCount(lines-1) > 0) Log.d(TAG, "Text is ellipsized"); } } });

Y, por último, no olvides eliminar removeOnGlobalLayoutListener cuando lo necesites por más tiempo.