2011-08-26 14 views
8

Estoy configurando Span como parte del texto. Span en sí funciona bien. Sin embargo, el texto es creado por String.format desde Resources y no sé start y end de la parte en el texto que voy a establecer Span to.Android: ¿Cómo combinar Spannable.setSpan con String.format?

Intenté utilizar etiquetas HTML personalizadas en strings.xml, pero getText o getString eliminarlas. Podría usar algo como esto getString(R.string.text, "<nb>" + arg + "</nb>"), luego Html.fromHtml(), porque el arg es exactamente donde quiero establecer el Span.

He visto this approach que utilizó el texto formateado "normal text ##span here## normal text". Analiza la cadena elimina etiquetas y establece Span.

Mi pregunta es, ¿hay una mejor manera de lograr la configuración de Span en una cadena formateada como "something %s something" o debería usar uno de los enfoques anteriores?

Respuesta

2

Lo resolví introduciendo la clase TaggedArg, las instancias de esta clase se expanden a <tag>value</tag>. Luego creé el objeto que es responsable de leer el texto que contiene las etiquetas y reemplazar estas etiquetas por tramos. Los diferentes tramos están registrados en la etiqueta del mapa-> fábrica.

Hubo una pequeña sorpresa. Si tiene texto como "<xx>something</xx> something", Html.fromHtml lee este texto como "<xx>something something</xx>". Tuve que agregar las etiquetas <html> en todo el texto para evitar esto.

2

getText() volverá SpannedString objetos que contienen el formato definido en strings.xml. Creé a custom version of String.format que conservará cualquier extensión en la cadena de formato, incluso si incluyen los especificadores de formato (también se conservan los intervalos en los argumentos SpannedString). Utilizar de esta manera:

Spanned toDisplay = SpanFormatter.format(getText(R.string.foo), bar, baz, quux); 
0

El camino por el que George getText() supone que es interesante. Pero no hay necesidad de escribir una clase extra. getText() devuelve un CharSequence. Así que utilice SpannableStringBuilder establecer esto en un TextView:

textViewCell.setText(new SpannableStringBuilder(getText(R.string.foo)); 

En su strings.xml se puede escribir con marcas HTML (no se olvide de las citas antes y después del texto):

<string name="foo">"CO<sub><small>2</small></sub>"</string> 

Este tipo de etiquetado funcionó para mí, ya sea configurándolo manualmente en un textView (como el anterior) o asignándolo en un diseño.