studio - Establecer el texto de TextView desde un recurso de cadena con formato html en XML
strings.xml español (6)
Tengo algunas cadenas fijas dentro de mis strings.xml
, algo así como:
<resources>
<string name="somestring">
<B>Title</B><BR/>
Content
</string>
</resources>
y en mi diseño tengo un TextView
que me gustaría llenar con la cadena con formato html.
<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>
si hago esto, el contenido de formattedtext
es solo el contenido de somestring
sin etiquetas html y por lo tanto sin formatear.
Sé que es posible configurar el texto formateado programáticamente con
.setText(Html.fromHtml(somestring));
porque uso esto en otras partes de mi programa donde está funcionando como se esperaba.
Para llamar a esta función, necesito una Activity
, pero en este momento mi diseño es simplemente una vista más o menos estática en XML simple y preferiría dejarlo así, para salvarme de la sobrecarga de crear una Activity
solo para establecer un poco de texto.
¿Estoy pasando por alto algo obvio? ¿No es posible en absoluto? ¡Cualquier ayuda o solución alternativa bienvenida!
Editar: He intentado algunas cosas y parece que el formato HTML en xml tiene algunas restricciones:
las etiquetas deben escribirse en minúsculas
algunas etiquetas que se mencionan here no funcionan, por ejemplo
<br/>
(es posible utilizar/n
lugar)
Android no tiene una especificación para indicar el tipo de cadena de recursos (por ejemplo, texto / texto simple o texto / html). Sin embargo, existe una solución que permitirá al desarrollador especificar esto dentro del archivo XML.
- Defina un atributo personalizado para especificar que el atributo android: text sea html.
- Use un TextView subclasificado.
Una vez que los define, puede expresarse con HTML en archivos xml sin tener que volver a llamar a setText (Html.fromHtml (...)). Estoy bastante sorprendido de que este enfoque no sea parte de la API.
Esta solución funciona en la medida en que el simulador de estudio de Android muestre el texto como HTML renderizado.
res / values / strings.xml (el recurso de cadena como HTML)
<resources>
<string name="app_name">TextViewEx</string>
<string name="string_with_html"><![CDATA[
<em>Hello</em> <strong>World</strong>!
]]></string>
</resources>
layout.xml (solo las partes relevantes)
Declare el espacio de nombres de atributos personalizados y agregue el atributo android_ex: isHtml. También use la subclase de TextView.
<RelativeLayout
...
xmlns:android_ex="http://schemas.android.com/apk/res-auto"
...>
<tv.twelvetone.samples.textviewex.TextViewEx
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/string_with_html"
android_ex:isHtml="true"
/>
</RelativeLayout>
res / values / attrs.xml (define los atributos personalizados para la subclase)
<resources>
<declare-styleable name="TextViewEx">
<attr name="isHtml" format="boolean"/>
<attr name="android:text" />
</declare-styleable>
</resources>
TextViewEx.java (la subclase de TextView)
package tv.twelvetone.samples.textviewex;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.Nullable;
import android.text.Html;
import android.util.AttributeSet;
import android.widget.TextView;
public TextViewEx(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextViewEx, 0, 0);
try {
boolean isHtml = a.getBoolean(R.styleable.TextViewEx_isHtml, false);
if (isHtml) {
String text = a.getString(R.styleable.TextViewEx_android_text);
if (text != null) {
setText(Html.fromHtml(text));
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
a.recycle();
}
}
}
En caso de que alguien lo encuentre, hay una alternativa más agradable que no está documentada (tropecé con ella después de buscar durante horas, y finalmente la encontré en la lista de errores para el SDK de Android). PUEDE incluir HTML sin formato en strings.xml, siempre que lo ajuste
<![CDATA[ ...raw html... ]]>
Ejemplo:
<string name="nice_html">
<![CDATA[
<p>This is a html-formatted string with <b>bold</b> and <i>italic</i> text</p>
<p>This is another paragraph of the same string.</p>
]]>
</string>
Luego, en tu código:
TextView foo = (TextView)findViewById(R.id.foo);
foo.setText(Html.fromHtml(getString(R.string.nice_html)));
En mi humilde opinión, esto es varios órdenes de magnitud más agradable para trabajar con :-)
Escape de sus etiquetas HTML ...
<resources>
<string name="somestring">
<B>Title</B><BR/>
Content
</string>
</resources>
Tengo otro caso cuando no tengo la oportunidad de poner CDATA en el xml, ya que recibo el código HTML de un servidor.
Esto es lo que obtengo de un servidor:
<p>The quick brown <br />
fox jumps <br />
over the lazy dog<br />
</p>
Parece ser más complicado, pero la solución es mucho más simple.
private TextView textView;
protected void onCreate(Bundle savedInstanceState) {
.....
textView = (TextView) findViewById(R.id.text); //need to define in your layout
String htmlFromServer = getHTMLContentFromAServer();
textView.setText(Html.fromHtml(htmlFromServer).toString());
}
¡Espero eso ayude!
Linh
Última actualización:
Html.fromHtml (cadena); // obsoleto después de las versiones de Android N ...
El siguiente código da soporte a android N y versiones anteriores ...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml(yourHtmlString,Html.FROM_HTML_MODE_LEGACY));
}
else
{
textView.setText(Html.fromHtml(yourHtmlString));
}
Como la respuesta principal aquí es sugerir algo incorrecto (o al menos demasiado complicado), creo que esto debería actualizarse, aunque la pregunta es bastante antigua:
Al utilizar recursos String en Android, solo tiene que llamar a getString(...)
desde el código Java o usar android:text="@string/..."
en su diseño XML.
Incluso si desea usar el marcado HTML en sus cadenas, no tiene que cambiar mucho:
Los únicos caracteres que necesita para escapar en sus recursos String son:
- comillas dobles:
"
convierte en/"
- comillas simples:
''
convierte/'
- ampersand:
&
convierte en&
o&
Eso significa que puede agregar su marcado HTML sin escapar de las etiquetas:
<string name="my_string"><b>Hello World!</b> This is an example.</string>
Sin embargo, para estar seguro, solo debe usar <b>
, <i>
y <u>
tal como aparecen en la documentación.
Si quieres usar tus cadenas de HTML desde XML , solo sigue usando android:text="@string/..."
, funcionará bien.
La única diferencia es que, si quieres usar tus cadenas de HTML desde el código de Java , tienes que usar getText(...)
lugar de getString(...)
ahora, ya que el primero conserva el estilo y el segundo solo tira apagado.
Es tan fácil como eso. No CDATA, no Html.fromHtml(...)
.
Solo necesitará Html.fromHtml(...)
si Html.fromHtml(...)
sus caracteres especiales en el marcado HTML. Úselo con getString(...)
entonces. Esto puede ser necesario si desea pasar el String a String.format(...)
.
Esto también se describe en los documentos .
Editar:
No hay diferencia entre getText(...)
con HTML no getText(...)
como he propuesto) o secciones de CDATA
y Html.fromHtml(...)
.
Vea el siguiente gráfico para una comparación: