Combinación de Spannable con String.format ()
Supongamos que tiene la siguiente cadena:
String s = "The cold hand reaches for the %1$s %2$s Ellesse's"; String old = "old"; String tan = "tan"; String formatted = String.format(s,old,tan); //"The cold hand reaches for the old tan Ellesse's"
Supongamos que desea terminar con esta cadena, pero también tiene un conjunto Span
determinado para cualquier palabra reemplazada por String.format
.
- El primer setSpan no funcionó
- ¿Cómo puedo utilizar onTouchListeners en cada palabra en un TextView?
- Cómo agregar la línea ondulada roja debajo del texto en el TextView de Android
- Alternativa a ReplacementSpan en Android
- Cómo configurar la fuente personalizada para palabra en un texto TextView
Por ejemplo, también queremos hacer lo siguiente:
Spannable spannable = new SpannableString(formatted); spannable.setSpan(new StrikethroughSpan(), oldStart, oldStart+old.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(new ForegroundColorSpan(Color.BLUE), tanStart, tanStart+tan.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
¿Hay una forma robusta de conocer los índices de inicio de old
y tan
?
Tenga en cuenta que sólo la búsqueda de 'antiguo' devuelve el 'viejo' en 'frío', por lo que no funcionará.
Lo que funciona, supongo, es buscar %[0-9]$s
antemano y calcular los desplazamientos para tener en cuenta las sustituciones en String.format
. Esto parece un dolor de cabeza, aunque, sospecho que podría haber un método como String.format
que es más informativo sobre los detalles de su formato. Bueno, ¿verdad?
- A veces, las extensiones de la imagen no son visibles cuando el contenido cubre varias líneas en la vista de texto
- Java.lang.ClassCastException: android.text.SpannableStringBuilder no se puede convertir en java.util.ArrayList
- La mejor manera de obtener una SpannableString de un SpannableStringBuilder
- SpannableString: ¿Es posible aplicar dos o más RelativeSizeSpans?
- Cómo alinear TextView alrededor de un ImageView?
- Android SpannableString establecer fondo detrás de parte del texto
- Alinear mapa de bits en SpannableStringBuilder
- ¿Por qué mostrar java.lang.ClassCastException: android.text.SpannableString no se puede transmitir a java.lang.String?
He creado una versión de String.format
que trabaja con spannables. Descárguelo y úselo como en la versión normal. En su caso, usted pondría los espacios alrededor de los especificadores de formato (posiblemente utilizando strings.xml). En la salida, estarían alrededor de lo que los especificadores fueron reemplazados con.
El uso de Spannables como eso es un dolor de cabeza – esta es probablemente la manera más sencilla:
String s = "The cold hand reaches for the %1$s %2$s Ellesse's"; String old = "<font color=\"blue\">old</font>"; String tan = "<strike>tan</strike>"; String formatted = String.format(s,old,tan); //The cold hand reaches for the <font color="blue">old</font> <strike>tan</strike> Ellesse's Spannable spannable = Html.fromHtml(formatted);
Problema: esto no se pone en un StrikethroughSpan
. Para hacer el StrikethroughSpan
, pedimos prestado un TagHandler
personalizado de esta pregunta .
Spannable spannable = Html.fromHtml(text,null,new MyHtmlTagHandler());
MyTagHandler:
public class MyHtmlTagHandler implements Html.TagHandler { public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if (tag.equalsIgnoreCase("strike") || tag.equals("s")) { processStrike(opening, output); } } private void processStrike(boolean opening, Editable output) { int len = output.length(); if (opening) { output.setSpan(new StrikethroughSpan(), len, len, Spannable.SPAN_MARK_MARK); } else { Object obj = getLast(output, StrikethroughSpan.class); int where = output.getSpanStart(obj); output.removeSpan(obj); if (where != len) { output.setSpan(new StrikethroughSpan(), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } private Object getLast(Editable text, Class kind) { Object[] objs = text.getSpans(0, text.length(), kind); if (objs.length == 0) { return null; } else { for (int i = objs.length; i > 0; i--) { if (text.getSpanFlags(objs[i - 1]) == Spannable.SPAN_MARK_MARK) { return objs[i - 1]; } } return null; } } }
- Cómo usar la función "Seleccionar depuración de la aplicación" y "esperar a que el depurador" nueva característica en jelly bean?
- Generar android apk utilizando shell script de php?