J'ai des chaînes fixes à l'intérieur de moi strings.xml
, quelque chose comme:
<resources>
<string name="somestring">
<B>Title</B><BR/>
Content
</string>
</resources>
et dans ma mise en page, j'en ai un TextView
que j'aimerais remplir avec la chaîne au format html.
<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 somestring
de toute balise html et donc non formaté.
Je sais qu'il est possible de définir le texte formaté par programmation avec
.setText(Html.fromHtml(somestring));
car je l'utilise dans d'autres parties de mon programme où il fonctionne comme prévu.
Pour appeler cette fonction, j'ai besoin d'un Activity
, mais pour le moment ma mise en page n'est qu'une simple vue plus ou moins statique en XML simple et je préfère le laisser de cette façon, pour me sauver de la surcharge de création d'un Activity
juste pour en définir texte.
Suis-je en train d'oublier quelque chose d'évident? N'est-ce pas possible du tout? Toute aide ou solution de contournement est la bienvenue!
Edit: Je viens d'essayer certaines choses et il semble que le formatage HTML en xml ait quelques contraintes:
les balises doivent être écrites en minuscules
certaines balises mentionnées ici ne fonctionnent pas, par exemple
<br/>
(il est possible d'utiliser à la\n
place)
Réponses:
Juste au cas où quelqu'un trouverait cela, il existe une alternative plus agréable qui n'est pas documentée (je l'ai trébuché après avoir cherché pendant des heures, et je l'ai finalement trouvée dans la liste des bogues pour le SDK Android lui-même). Vous POUVEZ inclure du HTML brut dans strings.xml, tant que vous l'enveloppez dans
Exemple:
Ensuite, dans votre code:
À mon humble avis, il est plus agréable de travailler avec plusieurs ordres de grandeur :-)
la source
Html.fromHtml(getString(R.string.nice_html))
morceau? :)Comme la meilleure réponse ici suggère quelque chose de mal (ou du moins trop compliqué), je pense que cela devrait être mis à jour, bien que la question soit assez ancienne:
Lorsque vous utilisez des ressources String dans Android, il vous suffit d'appeler à
getString(...)
partir du code Java ou d'utiliserandroid:text="@string/..."
dans votre mise en page XML.Même si vous souhaitez utiliser le balisage HTML dans vos chaînes, vous n'avez pas besoin de beaucoup changer:
Les seuls personnages que vous devez échapper dans vos ressources String sont:
"
devient\"
'
devient\'
&
devient&
ou&
Cela signifie que vous pouvez ajouter votre balisage HTML sans échapper aux balises:
Cependant, pour être sûr, vous devez uniquement utiliser
<b>
,<i>
et<u>
comme ils sont répertoriés dans la documentation.Si vous souhaitez utiliser vos chaînes HTML à partir de XML , continuez à utiliser
android:text="@string/..."
, cela fonctionnera bien.La seule différence est que, si vous souhaitez utiliser vos chaînes HTML à partir du code Java , vous devez utiliser à la
getText(...)
place degetString(...)
maintenant, car le premier conserve le style et le second le supprimera.C'est aussi simple que ça. Pas de CDATA, non
Html.fromHtml(...)
.Vous aurez seulement besoin
Html.fromHtml(...)
si vous avez encodez vos caractères spéciaux en HTML balisage. Utilisez-le avecgetString(...)
alors. Cela peut être nécessaire si vous souhaitez transmettre la chaîne àString.format(...)
.Tout cela est également décrit dans la documentation .
Éditer:
Il n'y a pas de différence entre
getText(...)
HTML non échappé (comme je l'ai proposé) ouCDATA
sections etHtml.fromHtml(...)
.Voir le graphique suivant pour une comparaison:
la source
getResources().getText(R.string.codename)
<b>
,<i>
,<u>
. Les autres balises ne sont pas toujours prises en charge.Échappez à vos balises HTML ...
la source
TextView
afficher HTML?fromHTML()
.Html.fromHTML()
vous devez encoder les caractères spéciaux. Étrange!Android n'a pas de spécification pour indiquer le type de chaîne de ressource (par exemple, text / plain ou text / html). Il existe cependant une solution de contournement qui permettra au développeur de le spécifier dans le fichier XML.
Une fois que vous les avez définis, vous pouvez vous exprimer avec du HTML dans des fichiers xml sans avoir à appeler à nouveau setText (Html.fromHtml (...)). Je suis plutôt surpris que cette approche ne fasse pas partie de l'API.
Cette solution fonctionne dans la mesure où le simulateur de studio Android affiche le texte au format HTML rendu.
res / values / strings.xml (la ressource de chaîne au format HTML)
layout.xml (uniquement les parties pertinentes)
Déclarez l'espace de noms d'attribut personnalisé et ajoutez l'attribut android_ex: isHtml. Utilisez également la sous-classe de TextView.
res / values / attrs.xml (définir les attributs personnalisés pour la sous-classe)
TextViewEx.java (la sous-classe de TextView)
la source
Dernière mise à jour:
Html.fromHtml(string);
// obsolète après les versions d'Android N ..Le code suivant prend en charge les versions Android N et supérieures ...
la source
la source
J'ai un autre cas où je n'ai aucune chance de mettre CDATA dans le xml car je reçois la chaîne HTML d'un serveur.
Voici ce que j'obtiens d'un serveur:
Cela semble plus compliqué mais la solution est beaucoup plus simple.
J'espère que ça aide!
Linh
la source