2011-10-26 8 views
22

Tengo un recurso de cadena llamado "foo". Puede ser una cadena simple ... o puede contener HTML. Esto puede cambiar con el tiempo: yo debería ser capaz de caja para arriba como al menos una SpannableString inmediatamente después de la lectura ya sea HTML o no (pero ¿??)Android: conversión entre Strings, SpannedStrings y Spannablestrings

Quiero conseguir que la CharSequence prima y el primer poder para mostrarlo tal como está (los caracteres exactos, no la "interpretación" de Android). En este momento no puedo hacer eso ... toString() decide arrancar las partes que no cree que quiera ver.

Me gustaría poder crear un SpannableString de esta y otras cadenas o SpannableStrings mediante concatenación utilizando algún método (ninguno de los normales funciona). Me gustaría utilizar SpannableString para mostrar el texto con formato HTML en una vista de texto.

Esto no debería ser difícil, pero claramente no lo estoy haciendo bien (hay muy poca información sobre esto que he encontrado hasta ahora). Seguramente hay una forma de interconvertir con precisión entre Strings, SpannedStrings e incluso Spannablestrings, sin perder las marcas en el camino?

Tenga en cuenta que ya he jugado con Linkify algo roto, pero quiero un mejor control sobre el proceso (sin "/" s no formateadas, hrefs adecuados, etc.) Puedo hacer que todo funcione SI permanecer en HTML en todos los pasos, aunque no puedo concatenar nada.

Editar 1: He aprendido que puedo usar lo siguiente para asegurarme siempre de obtener mi cadena sin formato (en lugar de lo que Android decida que cree que realmente es CharSequence). Bien ... ahora, ¿cómo convertir esto en un SpannableString?

<string name="foo"><![CDATA[ 
    <b>Some bold</b> 
]]> 
</string> 

Edición 2: No sé por qué esto no funcionó antes, pero ... si foo1 y foo2 están marcados cadenas como anteriormente (como CDATA), entonces uno puede parecer hacer esto:

String foo1 = (String)getResources().getText(R.string.foo1); 
String foo2 = (String)getResources().getText(R.string.foo2); 
SpannedString bar = new SpannedString(Html.fromHtml(foo1+foo2)); 

Curioso: ¿hay una solución más directa que esta? ¿Es este negocio CDATA realmente necesario? Parece enrevesado (pero no tan intrincado como nunca saber cuál será el tipo de recurso ... Cadena, Spannable, etc.)

+1

Parece que ha respondido su propia pregunta aquí. Tu ejemplo de foo1, foo2 de arriba parece estar bien. Si no tiene otra pregunta concreta, debe responder a su pregunta para que se elimine de la sección sin respuesta. CDATA es necesario para incrustar HTML en XML porque, de lo contrario, los elementos html no se podrán distinguir del XML adjunto. –

Respuesta

1

Parece que no hay una manera más directa de lograr esto.

1

Tuve el mismo problema. Hay dos soluciones de acuerdo con Google API Guides.

Primero es para escapar de la marca < con &lt; en el recurso de cadena. Desafortunadamente, la conversión String quita la etiqueta en el fondo.

En segundo lugar es utilizar Cadenas de formato en lugar de etiquetas XML/HTML. Parece más simple, más rápido y evade los problemas de conversión ocultos. getString(resource, ...) funciona como printf(string, ...) aquí.

Ambos funcionan y requieren algún código para reemplazar una parte determinada de la cadena de todos modos (manipular etiquetas o cadenas de formato). ¡Disfrutar! =)

Cuestiones relacionadas