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. :-)