565 votes

Est-il possible d'avoir plusieurs styles dans un TextView ?

Est-il possible de définir plusieurs styles pour différents morceaux de texte dans un TextView ?

Par exemple, je configure le texte comme suit :

tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);

Est-il possible d'avoir un style différent pour chaque élément de texte ? Par exemple, ligne1 en gras, mot1 en italique, etc.

Le guide du développeur Tâches courantes et comment les effectuer dans Android comprend Sélectionner, mettre en évidence ou styliser des parties de texte :

// Get our EditText object.
EditText vw = (EditText)findViewById(R.id.text);

// Set the EditText's text.
vw.setText("Italic, highlighted, bold.");

// If this were just a TextView, we could do:
// vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE);
// to force it to use Spannable storage so styles can be attached.
// Or we could specify that in the XML.

// Get the EditText's internal text storage
Spannable str = vw.getText();

// Create our span sections, and assign a format to each.
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Mais cela utilise des numéros de position explicites dans le texte. Existe-t-il un moyen plus propre de le faire ?

6 votes

If the TextView string is static, you can just add html <b>, <i>, and <u> tags into the strings resource file and they will automatically be applied. E.g. <TextView Android:text="@string/test" /> where @string/test is set to <string><b>bold</b>, <i>italic</i></string>

2 votes

+1 @greg7gkb ! Le mot clé est "statique". Je m'arrachais les cheveux en me demandant pourquoi certaines de mes chaînes de caractères fonctionnaient avec <b>et d'autres pas. Celles qui ne fonctionnaient pas contenaient des variables.

703voto

Legend Points 29504

Au cas où quelqu'un se demanderait comment faire, voici une façon de le faire : (Merci encore à Mark !)

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
            "<small>" + description + "</small>" + "<br />" + 
            "<small>" + DateAdded + "</small>"));

Pour une liste non officielle des balises prises en charge par cette méthode, consultez le site suivant ce lien .

1 votes

@JanisGruzis : Peut-être qu'une façon de le faire est d'utiliser une méthode de stub, par exemple, formatTextWhite(string text) qui insère simplement le texte dans la chaîne de format suivante : "<font size="..." color="..." face="...">%s</font>" .

0 votes

@Legend i have used <font fgcolor='#ffff5400'><b><big>" + "Title" + "</big></b> </font> but the fgcolor/color(both tried) is not working...do you know how to do the color thing using html

0 votes

@MuhammadBabar : Pouvez-vous essayer ceci : Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>"); ? Je me souviens que ça a marché pour moi il y a quelques temps. Je ne sais pas si ça marche encore.

220voto

CommonsWare Points 402670

Essayez Html.fromHtml() et marquez votre texte avec des balises HTML en gras et en italique, par ex :

Spanned text = Html.fromHtml("This mixes <b>bold</b> and <i>italic</i> stuff"); textView.setText(text);

0 votes

Super... Ca marche... Maintenant, si je veux une taille différente pour différents textes, je suppose que ce n'est pas correct de le mettre dans le balisage html parce que la balise font est dépréciée... Existe-t-il un autre moyen de le faire ?

1 votes

En fait, cela m'amène à une autre question : Est-il préférable d'avoir un textview avec du texte html à l'intérieur ou trois text views avec des balises différentes sans utiliser la classe html ? Je suppose que c'est évidemment la première solution, mais je voulais juste le confirmer...

2 votes

Je n'ai aucune idée de la liste complète des balises supportées par Html.fromHtml() -- il faudrait regarder le code source. Le balisage en ligne et les widgets TextView multiples devraient être des décisions orthogonales. Utilisez plusieurs widgets si vous avez besoin d'un placement précis de morceaux de texte discrets. Utilisez le balisage en ligne si vous avez besoin d'un balisage en ligne dans un widget. Rappelez-vous : il n'y a pas de FlowLayout dans Android, donc enchaîner plusieurs TextViews pour créer un paragraphe n'est pas vraiment pratique AFAIK.

192voto

Millthorn Points 1257

Légèrement hors sujet, mais j'ai trouvé cela trop utile pour ne pas être mentionné ici.

Et si nous voulions lire le texte Html à partir de string.xml et faciliter ainsi sa localisation. CDATA rendent cela possible :

<string name="my_text">
  <![CDATA[
    <b>Autor:</b> Mr Nice Guy<br/>
    <b>Contact:</b> myemail@grail.com<br/>
    <i>Copyright © 2011-2012 Intergalactic Spacebar Confederation </i>
  ]]>
</string> 

Depuis notre code Java, nous pouvons maintenant l'utiliser comme suit :

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml(getString(R.string.my_text))); 

Je ne m'attendais pas à ce que cela fonctionne. Mais ça a marché.

J'espère que cela sera utile à certains d'entre vous !

2 votes

Habituellement, "false" implique que vous avez accédé à une valeur bizarre dans la table de consultation. J'ai obtenu ce résultat lorsque j'avais R.id.ok et R.string.ok, et que j'ai accidentellement utilisé getString(R.id.ok) au lieu du bon getString(R.string.ok).

0 votes

Cela fonctionne-t-il également dans un layout-XML ? Lorsque je fais référence à la ressource chaîne avec "@string/someText" (où "someText" est une ressource définie dans un strings.xml), j'obtiens simplement la chaîne avec toutes les balises HTML comme "texte".

3 votes

J'ai trouvé que c'était la meilleure réponse. Elle m'a inspiré. Je n'ai pas pu m'empêcher d'y ajouter mes deux centimes de réponse. Solution ici gist.github.com/aegis1980/b138dcb2fd1b2e98aa30 vous permet d'assigner dans le fichier de mise en page afin que vous n'ayez pas besoin d'assigner la ressource texte programmatiquement (et vous pouvez prévisualiser dans Android Studio !)

138voto

Kent Andersen Points 653

Si vous n'avez pas envie d'utiliser le langage html, vous pouvez simplement créer un fichier styles.xml et l'utiliser comme ceci :

TextView tv = (TextView) findViewById(R.id.textview);
SpannableString text = new SpannableString(myString);

text.setSpan(new TextAppearanceSpan(getContext(), R.style.myStyle), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myNextStyle), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

tv.setText(text, TextView.BufferType.SPANNABLE);

0 votes

Copier/coller dans une application Android simple sur laquelle vous pourriez travailler. Vous verrez que deux styles seront appliqués à une seule fenêtre de texte.

0 votes

Désolé, je n'ai pas été clair. si vous devez spécifier la sous-chaîne (via les deux index) de l'endroit où appliquer le style, cela ne fonctionne pas pour les chaînes localisées car les index seront bien sûr différents pour chaque locale.

0 votes

Vous avez raison. Si vous prenez en charge plusieurs langues, ce n'est pas la voie à suivre. Sauf si vous êtes sûr que la chaîne ne changera pas de taille... comme le nom de l'application par exemple.

46voto

Jon Points 406

Une réponse très tardive, mais la liste des balises prises en charge est ici : http://developer.Android.com/guide/faq/commontasks.html#selectingtext

Cela montre aussi que Html.fromHtml n'est pas vraiment nécessaire.

1 votes

Html.fromHtml est souvent un moyen plus facile de styliser le texte. En outre, ce lien figure déjà dans la question initiale.

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