android - programacion - Especificación de "tachado" en una sección del texto de TextView
manual de android en pdf (6)
Tengo un bloque de texto proveniente de un servicio web y, dependiendo de algunas etiquetas que he predefinido, quiero aplicar un estilo al texto antes de configurarlo en mi TextView. Para negrita, cursiva y subrayado, pude hacerlo fácilmente con el comando replaceAll:
PageText = PageText.replaceAll("//*([a-zA-Z0-9]+)//*", "<b>$1</b>");
PageText = PageText.replaceAll("=([a-zA-Z0-9]+)=", "<i>$1</i>");
PageText = PageText.replaceAll("_([a-zA-Z0-9]+)_", "<u>$1</u>");
txtPage.setText(Html.fromHtml(PageText), TextView.BufferType.SPANNABLE);
Entonces, para poner una palabra en negrita, rodéala con * ''s, para cursivas, rodea con _.
Pero, por tachado, Html.fromHtml no admite la etiqueta "strike", por lo que no se puede hacer de la misma manera. He visto ejemplos del uso de Spannable para establecer el estilo en una sección del texto, pero requiere números de posición. Por lo tanto, supongo que podría recorrer el texto, buscando - (la etiqueta para representar la huelga), luego buscar el siguiente, abarcar el texto intermedio y repetir para todas esas cadenas. Terminará siendo 10 líneas de código de bucle en lugar de 1 para los demás, así que me pregunto si hay una solución más elegante por ahí.
¿Estás seguro de que Html.fromHtml
no admite <strike>
? Esta en la lista de este blog de Commonsware.
Aquí hay una solución utilizando un TagHandler personalizado que debe pasar a Html.fromHtml ().
La solución @Suresh funciona si desea tachar todo el TextView, pero si desea tachar solo algunas partes del texto, use el código a continuación.
tvMRP.setText(text, TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) tvMRP.getText();
spannable.setSpan(new StrikethroughSpan(), 3, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Aquí el text
es el texto que queremos que muestre TextView, 3
es el no. de caracteres (comenzando desde 0) desde donde comenzará el tachado.
Parece que no es realmente compatible, al menos no funciona en Android 3.1.
@ RMS2 si el texto es pequeño, puede dividirlo en dos o tres vistas de texto separadas y aplicar la marca solo a la que desea, no es perfecto para textos largos;
Puede hacerlo con un TagHandler
personalizado como el de esta pregunta SO :
Spanned parsed = Html.fromHtml(PageText, null, new MyHtmlTagHandler());
Y el TagHandler
implementa los métodos:
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if(tag.equalsIgnoreCase("strike") || tag.equals("s")) {
processStrike(opening, output);
}
}
....
Si solo se trata de TextView, puede utilizar las banderas de pintura.
TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);