2011-11-17 7 views
12

En mi aplicación, me gustaría definir un formato de cadena en strings.xml que tiene este aspecto (tenga en cuenta las etiquetas <b>...</b>):¿Cómo puedo usar estilos html en cadenas con argumentos de formato?

<string name="location"><b>Location:</b> %1$s</string> 

y luego usar getString(int, Object...) a sustituir en un argumento de formato:

String formattedString = getString(R.string.location, "Edmonton, AB"); 

Esto produce un valor de "Location: Edmonton, AB". Me gustaría obtener un valor de "<b>Location:</b> Edmonton, AB".

¿Hay alguna forma de hacerlo usando formatos de cadenas en strings.xml sin dividirlo en dos cadenas?

Respuesta

17

Desde el docs:

A veces es posible que desee crear un recurso de texto con estilo que es también utilizado como cadena de formato. Normalmente, esto no funcionará porque el método String.format (String, Object ...) quitará toda la información del estilo de la cadena. La solución a esto es escribir las etiquetas HTML con entidades escapadas, que luego se recuperan con desde HTML (cadena), una vez que se formatea.

Por ejemplo:

<resources> 
    <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string> 
</resources> 

Asegúrese de escapar el texto que está de paso en String.format()

String escapedUsername = TextUtils.htmlEncode(username); 
Resources res = getResources(); 
String text = String.format(res.getString(R.string.welcome_messages), escapedUsername, mailCount); 
CharSequence styledText = Html.fromHtml(text); 
+0

¡Gracias, no estoy seguro de cómo me perdí eso en los documentos! – Greg

+0

@GregInYEG - Le sucede a los mejores de nosotros. El gusto es mio. –

+0

Solo tenga en cuenta que el método TextUtils.htmlEncode() no reemplaza '' (espacio) con ' '. Esto está causando problemas en mi caso (estoy usando mailto: hipervínculo con los parámetros del tema y el cuerpo). De lo contrario, la solución anterior funciona de maravilla. – pepan

1

Usar String.Format. p.ej.

<string name="location"><![CDATA[<b>Location:</b> %s]]></string> 

String formattedString = String.Format(getString(R.string.location), "Edmonton, AB"); 
+0

La cadena en su ejemplo no contiene estilos. Si lo hiciera, la llamada a getString (R.string.location) los eliminaría. – Greg

+0

Pensé que el punto era formatear una cadena, que es lo que hace mi ejemplo. Agregue los caracteres de formato como parámetros adicionales al método de formato. – Kuffs

+0

String.format (getString (R.string.location), "Edmonton, AB") devuelve lo mismo que getString (R.string.location, "Edmonton, AB"). Tampoco se conservan estilos como ... en la cadena de strings.xml. La respuesta de @ iPaulPro a la documentación de Android que explica si quiero usar ambos estilos y argumentos de formato, necesito escapar de los estilos y usar Html.fromHtml (...). – Greg

Cuestiones relacionadas