Définir le texte TextView à partir d’une chaîne de caractères au format HTML dans XML

J’ai quelques chaînes fixes dans ssortingngs.xml , quelque chose comme:

   Title
Content

et dans ma mise en page, j’ai un TextView que je voudrais remplir avec la chaîne au format html.

  

Si je le fais, le contenu de formattedtext n’est que le contenu de somessortingng de balises html et donc non formaté.

Je sais qu’il est possible de définir le texte formaté par programmation avec

.setText(Html.fromHtml(somessortingng));

parce que je l’utilise dans d’autres parties de mon programme où il fonctionne comme prévu.

Pour appeler cette fonction, il me faut une Activity , mais pour le moment, ma mise en page est une simple vue plus ou moins statique en XML et je préférerais la laisser ainsi, pour me sauver de la création d’une Activity juste pour définir du texte.

Est-ce que j’oublie quelque chose d’évident? N’est-ce pas possible? Toute aide ou solution de contournement est la bienvenue!

Edit: Je viens d’essayer certaines choses et il semble que le formatage HTML dans xml comporte des ressortingctions:

  • les balises doivent être écrites en minuscules

  • certaines balises mentionnées ici ne fonctionnent pas, par exemple
    (il est possible d’utiliser plutôt \n )

Juste au cas où quelqu’un trouverait ceci, il y a une alternative plus agréable qui n’est pas documentée (je l’ai trébuché après avoir cherché pendant des heures, et l’ai finalement trouvée dans la liste de bogues pour le SDK Android lui-même). Vous pouvez inclure du HTML brut dans ssortingngs.xml, à condition que vous l’enveloppiez

  

Exemple:

  This is a html-formatted ssortingng with bold and italic text

This is another paragraph of the same ssortingng.

]]>

Ensuite, dans votre code:

 TextView foo = (TextView)findViewById(R.id.foo); foo.setText(Html.fromHtml(getSsortingng(R.ssortingng.nice_html))); 

IMHO, c’est plusieurs ordres de grandeur plus agréable de travailler avec 🙂

Comme la première réponse suggère quelque chose qui ne va pas (ou du moins trop compliqué), je pense que cela devrait être mis à jour, même si la question est assez ancienne:

Lorsque vous utilisez des ressources Ssortingng dans Android, il vous suffit d’appeler getSsortingng(...) partir du code Java ou d’utiliser android:text="@ssortingng/..." dans votre XML de présentation.

Même si vous voulez utiliser le balisage HTML dans vos chaînes, vous n’avez pas à changer beaucoup:

Les seuls caractères que vous devez échapper dans vos ressources Ssortingng sont les suivants:

  • guillemet double: " devient \"
  • guillemet simple: ' devient \'
  • esperluette: & devient & ou &

Cela signifie que vous pouvez append votre balisage HTML sans échapper aux balises:

 Hello World! This is an example. 

Cependant, pour être sûr, vous ne devez utiliser que , et comme ils sont répertoriés dans la documentation.

Si vous souhaitez utiliser vos chaînes HTML à partir de XML , continuez à utiliser android:text="@ssortingng/..." , cela fonctionnera correctement.

La seule différence est que, si vous souhaitez utiliser vos chaînes HTML à partir du code Java , vous devez getText(...) utiliser getText(...) au lieu de getSsortingng(...) , le premier conservant le style et le second ne faisant que supprimer ça s’arrête.

C’est aussi simple que ça. Pas de CDATA, pas de Html.fromHtml(...) .

Vous aurez seulement besoin de Html.fromHtml(...) si vous avez Html.fromHtml(...) vos caractères spéciaux dans le balisage HTML. Utilisez-le avec getSsortingng(...) alors. Cela peut être nécessaire si vous souhaitez transmettre la chaîne à Ssortingng.format(...) .

Tout cela est également décrit dans les documents .

Modifier:

Il n’y a pas de différence entre getText(...) avec le HTML non getText(...) comme je l’ai proposé) ou les sections CDATA et Html.fromHtml(...) .

Voir le graphique suivant pour une comparaison:

entrer la description de l'image ici

Echappez vos balises HTML …

   <B>Title</B><BR/> Content   

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 une solution de contournement, cependant, qui permettra au développeur de spécifier cela dans le fichier XML.

  1. Définissez un atsortingbut personnalisé pour spécifier que l’atsortingbut android: text est html.
  2. Utilisez un TextView sous-classé.

Une fois que vous les définissez, vous pouvez vous exprimer avec HTML dans des fichiers XML sans avoir à appeler setText (Html.fromHtml (…)) à nouveau. 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 affichera le texte au format HTML.

entrer la description de l'image ici

res / values ​​/ ssortingngs.xml (la ressource de chaîne au format HTML)

  TextViewEx Hello World! ]]>  

layout.xml (uniquement les parties pertinentes)

Déclarez l’espace de noms d’atsortingbut personnalisé et ajoutez l’atsortingbut android_ex: isHtml. Utilisez également la sous-classe de TextView.

    

res / values ​​/ attrs.xml (définit les atsortingbuts personnalisés pour la sous-classe)

        

TextViewEx.java (la sous-classe 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.AtsortingbuteSet; import android.widget.TextView; public TextViewEx(Context context, @Nullable AtsortingbuteSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAtsortingbutes(attrs, R.styleable.TextViewEx, 0, 0); try { boolean isHtml = a.getBoolean(R.styleable.TextViewEx_isHtml, false); if (isHtml) { Ssortingng text = a.getSsortingng(R.styleable.TextViewEx_android_text); if (text != null) { setText(Html.fromHtml(text)); } } } catch (Exception e) { e.printStackTrace(); } finally { a.recycle(); } } } 

Dernière mise à jour:

Html.fromHtml (ssortingng); // déconseillé après les versions d’Android N ..

Le code suivant prend en charge les versions Android N et supérieures …

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { textView.setText(Html.fromHtml(yourHtmlSsortingng,Html.FROM_HTML_MODE_LEGACY)); } else { textView.setText(Html.fromHtml(yourHtmlSsortingng)); } 

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 je reçois d’un serveur:

 

The quick brown 
fox jumps 
over the lazy dog

Cela semble plus compliqué mais la solution est beaucoup plus simple.

 private TextView textView; protected void onCreate(Bundle savedInstanceState) { ..... textView = (TextView) findViewById(R.id.text); //need to define in your layout Ssortingng htmlFromServer = getHTMLContentFromAServer(); textView.setText(Html.fromHtml(htmlFromServer).toSsortingng()); } 

J’espère que cela aide!
Linh