205 votes

La valeur texte TextView de ressource de type chaîne au format html en XML

J'ai quelques cordes fixes à l'intérieur de mon strings.xml, quelque chose comme:

<resources>
    <string name="somestring">
        <B>Title</B><BR/>
        Content
    </string>
</resources>

et dans ma présentation j'ai un TextView que je voudrais remplir avec le format html de la chaîne.

<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>

si je fais cela, le contenu de formattedtext est juste le contenu de somestring dépouillé de toutes les balises html et donc sans mise en forme.

Je sais qu'il est possible de définir la mise en forme de texte par programmation avec

.setText(Html.fromHtml(somestring));

parce que-je l'utiliser dans d'autres parties de mon programme là où il fonctionne comme prévu.

Pour appeler cette fonction, j'ai besoin d'un Activity, mais au moment de ma mise en page est un simple plus ou moins statiques de la vue dans la plaine, XML et je préfère le laisser comme ça, pour me sauver de la surcharge de la création d'un Activity seulement de mettre un peu de texte.

Suis-je surplombant quelque chose d'évident? N'est-il pas possible? De l'aide ou des solutions de contournement bienvenue!

Edit: Juste essayé certaines choses, et il semble que la mise en forme HTML en xml a quelques contraintes:

  • les balises doivent être écrits en minuscules

  • certaines balises qui sont mentionnés ici ne fonctionnent pas, par exemple, <br/> (il est possible d'utiliser \n à la place)

494voto

Bitbang3r Points 2787

Juste au cas où quelqu'un le trouve, il y a une belle alternative qui n'est pas documenté (j'ai trébuché sur elle après avoir cherché pendant des heures, et finit par la trouver dans la liste des bugs pour le SDK Android lui-même). Vous POUVEZ inclure du HTML brut, dans strings.xml tant que vous enveloppez-le de

<![CDATA[ ...raw html... ]]>

Exemple:

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

Puis, dans votre code:

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

À mon humble avis, c'est de plusieurs ordres de grandeur plus agréable de travailler avec :-)

139voto

Marco W. Points 2685

Comme la réponse sommet, voici ce qui suggère quelque chose de mal (ou au moins trop compliqué), je pense que ça devrait être mis à jour, bien que la question est assez ancien:

Lors de l'utilisation de ressources de Chaîne dans Android, vous avez juste à appeler getString(...) à partir du code Java ou utiliser android:text="@string/..." dans votre mise en page XML.

Même si vous voulez utiliser des balises HTML dans vos Cordes, vous n'avez pas à changer beaucoup de choses:

Les seuls caractères que vous avez besoin de s'échapper dans votre Chaîne de ressources sont les suivants:

  • guillemet double: " devient \"
  • guillemet simple: ' devient \'
  • esperluette: & devient &#38; ou &amp;

Cela signifie que vous pouvez ajouter votre balisage HTML, sans échapper à la tags:

<string name="my_string"><b>Hello World!</b> This is an example.</string>

Cependant, pour être sûr, vous ne devez utiliser <b>, <i> et <u> comme ils sont indiqués dans la documentation.

Si vous souhaitez utiliser votre code HTML chaînes de XML, il suffit de garder sur l'utilisation de l' android:text="@string/...", cela fonctionnera très bien.

La seule différence est que, si vous souhaitez utiliser votre code HTML chaînes à partir du code Java, vous devez utiliser getText(...) au lieu de getString(...) maintenant, comme l'ancien conserve le style et le dernier sera juste la bande.

C'est aussi simple que cela. Pas CDATA, pas de Html.fromHtml(...).

Vous aurez seulement besoin d' Html.fromHtml(...) si vous ne l'encoder les caractères spéciaux dans le balisage HTML. L'utiliser avec d' getString(...) ensuite. Cela peut être nécessaire si vous souhaitez passer la Chaîne d' String.format(...).

Tout ceci est décrit dans la documentation .

Edit:

Il n'y a pas de différence entre getText(...) avec sans échappement HTML (comme je l'ai proposé) ou CDATA sections et Html.fromHtml(...).

Voir le graphique ci-dessous pour une comparaison:

enter image description here

Pour plus d'informations, voir ici.

16voto

ekawas Points 3288

Échapper à vos balises HTML...

2voto

Linh Lino Points 332

J’ai un autre cas, quand je n’ai aucune chance de mettre CDATA dans le code xml que je recevrai la chaîne HTML à partir d’un serveur.

Voici ce que j’en retire un serveur :

Il semble être plus compliqué, mais la solution est beaucoup plus simple.

J’espère que ça aide !
Linh

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X