android textview android-textview ellipsis

Comprueba si textview está ellipsized en Android



android-textview ellipsis (3)

Puede usar este método provisto: getEllipsisCount

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

donde la línea se puede obtener a través de getLineCount ()

Tengo TextView con ancho como wrap content . En este TextView , configuro texto, pero el texto no tiene la misma longitud cada vez. Cuando el texto es muy largo, uso una sola línea verdadera y ellipsize : fin. Pero ahora tengo un problema. Quiero establecer la visibilidad de otro diseño, pero eso depende de la longitud de mi texto. Si el texto es demasiado largo para caber en la pantalla, quiero establecer True, pero cuando el texto es corto y no necesito ellipsize, quiero establecer la visibilidad como falsa. Entonces necesito verificar el estado de mi TextView. Cuando su elipsis quiero establecer setVisible verdadero, cuando no está setVisible es setVisible falso. Como puedo hacer eso. Esto es lo que conseguí:

tvAle.post(new Runnable() { @Override public void run() { int lineCount = tvAle.getLineCount(); Paint paint = new Paint(); paint.setTextSize(tvAle.getTextSize()); final float size = paint.measureText(tvAle.getText().toString()); Log.v("a", ""+size+" "+tvAle.getWidth()); if ((int)size > (tvAle.getWidth()+10)) { allergiesLayout.setVisibility(View.VISIBLE); } else allergiesLayout.setVisibility(View.GONE); }

pero esta solución no funciona.


Usar 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 un indicador para guardar si el texto es demasiado largo 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.


Bueno, la solución aceptada funciona, pero se pierden algunos casos de esquina porque solo verificará la última línea para los caracteres elípticos. Si tenemos un TextView que consta de dos líneas y usamos TruncateAt.START para truncar el texto al principio, la respuesta aceptada fallará. : - /

Agregar un ViewTreeObserver.OnPreDrawListener me parece más bien una sobrecarga realmente cara. Así que hice las siguientes mejoras al código de la respuesta aceptada:

/** * Checks if the text of the supplied {@link TextView} has been ellipsized. * * @param textView * The {@link TextView} to check its text. * * @return {@code True} if the text of the supplied {@code textView} has been ellipsized. */ public static boolean isTextViewEllipsized(final TextView textView) { // Initialize the resulting variable boolean result = false; // Check if the supplied TextView is not null if (textView != null) { // Check if ellipsizing the text is enabled final TextUtils.TruncateAt truncateAt = textView.getEllipsize(); if (truncateAt != null && !TextUtils.TruncateAt.MARQUEE.equals(truncateAt)) { // Retrieve the layout in which the text is rendered final Layout layout = textView.getLayout(); if (layout != null) { // Iterate all lines to search for ellipsized text for (int index = 0; index < layout.getLineCount(); ++index) { // Check if characters have been ellipsized away within this line of text result = layout.getEllipsisCount(index) > 0; // Stop looping if the ellipsis character has been found if (result) { break; } } } } } return result; }

Sin embargo, todavía hay margen de mejora. Pero este método es suficiente para mis casos de uso. Las correcciones y mejoras son apreciadas. :-)