Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Establecer TextView texto de html-formatted cadena recurso en XML

Tengo algunas cadenas fijas dentro de mi 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 html-formateado.

 <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 sólo el contenido de somestring despojado de cualquier etiqueta html y por lo tanto sin formato.

Sé que es posible establecer el texto formateado mediante programación 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 por el momento mi diseño es simplemente una simple vista más o menos estática en XML simple y prefiero dejarlo así, para salvarme de la sobrecarga de crear una Activity sólo para Fije un poco de texto.

¿Estoy mirando algo obvio? ¿No es posible en absoluto? Cualquier ayuda o soluciones son bienvenidas!

Edit: Acabo de probar 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 aquí no funcionan, por ejemplo, <br/> (es posible usar \n lugar)

  • Mostrar el número total como texto para múltiples pines con un pin en la misma ubicación en el mapa en android
  • ¿Cómo obtener coordenadas de un ClickableSpan dentro de un TextView?
  • Desplazamiento horizontal automático en TextView
  • Android - Cómo configurar una fuente personalizada para toda la aplicación
  • TextView en la Galería
  • Cómo escribir texto de derecha a izquierda (Texto árabe) en Android?
  • Establecer dinámicamente vínculos a texto en strings.xml
  • Visualización de varias líneas de texto y variables en un AlertDialog mediante setMessage ()
  • 6 Solutions collect form web for “Establecer TextView texto de html-formatted cadena recurso en XML”

    Sólo en caso de que alguien encuentre esto, hay una alternativa más agradable que no está documentado (tropecé sobre él después de buscar durante horas, y finalmente lo encontré en la lista de errores para el propio SDK de Android). Puede incluir HTML sin formato en strings.xml, siempre y cuando lo envuelva en

     <![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> 

    Entonces, en su código:

     TextView foo = (TextView)findViewById(R.id.foo); foo.setText(Html.fromHtml(getString(R.string.nice_html))); 

    IMHO, este es varios órdenes de magnitud más agradable para trabajar con 🙂

    Como la respuesta principal aquí es sugerir algo malo (o al menos demasiado complicado), siento que esto debe ser actualizado, aunque la pregunta es bastante antigua:

    Cuando uses recursos de String en Android, solo tienes que llamar a getString(...) desde el código Java o usar android:text="@string/..." en el XML de tu diseño.

    Incluso si desea utilizar el marcado HTML en sus cadenas, no tiene que cambiar mucho:

    Los únicos caracteres que necesitas para escapar en tus recursos de String son:

    • Comillas dobles: " convierte en \"
    • Comillas simples: ' convierte en \'
    • Ampersand: & convierte en &#38; O &amp;

    Esto 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, sólo debe utilizar <b> , <i> y <u> ya que se enumeran en la documentación.

    Si desea utilizar sus cadenas de HTML desde XML , siga usando android:text="@string/..." , funcionará bien.

    La única diferencia es que, si quieres usar tus cadenas HTML del código Java , debes usar getText(...) lugar de getString(...) ahora, ya que el primero conserva el estilo y el último solo se desnudará apagado.

    Es tan fácil como eso. No CDATA, no Html.fromHtml(...) .

    Sólo necesitará Html.fromHtml(...) si Html.fromHtml(...) sus caracteres especiales en el marcado HTML. Utilícelo con getString(...) . Esto puede ser necesario si desea pasar la String a String.format(...) .

    Todo esto también se describe en los documentos .

    Editar:

    No hay diferencia entre getText(...) con HTML sin getText(...) como he propuesto) o secciones de CDATA y Html.fromHtml(...) .

    Vea el siguiente gráfico para una comparación:

    Introduzca aquí la descripción de la imagen

    Escapar de las etiquetas HTML …

     <resources> <string name="somestring"> &lt;B&gt;Title&lt;/B&gt;&lt;BR/&gt; Content </string> </resources> 

    Android no tiene una especificación para indicar el tipo de cadena de recursos (por ejemplo, texto / plano o texto / html). Hay una solución, sin embargo, que permitirá al desarrollador especificar esto dentro del archivo XML.

    1. Defina un atributo personalizado para especificar que el atributo android: text es html.
    2. Utilice un TextView subclaseado.

    Una vez que los defina, 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 es parte de la API.

    Esta solución funciona en la medida en que el simulador de Android Studio mostrará el texto como HTML representado.

    Introduzca aquí la descripción de la imagen

    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 atributo personalizado 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 (defina 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(); } } } 

    Última actualización:

    Html.fromHtml (string); // desaprobado 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)); } 

    Tengo otro caso cuando no tengo ninguna posibilidad de poner CDATA en el xml como recibo la cadena HTML de un servidor.

    Esto es lo que obtengo de un servidor:

     <p>The quick brown&nbsp;<br /> fox jumps&nbsp;<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

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.