90 votes

Android : Colorer une partie d'une chaîne en utilisant TextView.setText() ?

Je cherche à modifier le texte d'une vue TextView via la méthode .setText("") tout en colorant une partie du texte (ou en le rendant gras, italique, transparent, etc.) et pas le reste. Par exemple :

title.setText("Your big island <b>ADVENTURE!</b>";

Je sais que le code ci-dessus est incorrect mais il permet d'illustrer ce que je voudrais obtenir. Comment dois-je m'y prendre ?

0 votes

0 votes

S'il y a un texte long dans le TextView,Il y a un moyen plus efficace

0 votes

210voto

Alex Orlov Points 9229

Utilisez s'étend sur .

Exemple :

final SpannableStringBuilder sb = new SpannableStringBuilder("your text here");

// Span to set text color to some RGB value
final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(158, 158, 158)); 

// Span to make text bold
final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); 

// Set the text color for first 4 characters
sb.setSpan(fcs, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

// make them also bold
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

yourTextView.setText(sb);

11 votes

Je n'aime vraiment pas la solution proposée par Android, car elle ne fonctionne pas avec le multilinguisme et je n'ai aucune idée du nombre de caractères de mes mots. Je suis actuellement à la recherche d'une solution où je peux avoir plusieurs travées que je peux attacher à un TextView et ensuite ils sont mis ensemble.

1 votes

Le commentaire disant span pour rendre le texte gras, devrait-il dire span pour rendre le texte en couleur ?

9 votes

@philipp si votre problème est le nombre de caractères de votre mot, utilisez la méthode length() sur votre String ou StringBuilder ou autre.

47voto

sat Points 9580
title.setText(Html.fromHtml("Your big island <b>ADVENTURE!</b>"));

2 votes

Il s'agit d'une solution bien plus agréable au problème initial que la réponse marquée.

1 votes

Si vous avez des sauts de ligne \n cela n'affiche pas les sauts de ligne.

9 votes

Non, ce n'est pas plus joli, il n'y a pas de fonction de coloration, mentionnée dans la question mais la méthode SLOW fromHTML()

26voto

Luis Points 71

J'espère que cela vous aidera (cela fonctionne avec le multilinguisme).

<string name="test_string" ><![CDATA[<font color="%1$s"><b>Test/b></font>]]> String</string>

Et sur votre code java, vous pouvez faire :

int color = context.getResources().getColor(android.R.color.holo_blue_light);
String string = context.getString(R.string.test_string, color);
textView.setText(Html.fromHtml(string));

De cette façon, seule la partie "Test" sera colorée (et en gras).

3 votes

Meilleure réponse. Cela fonctionne parfaitement pour les chaînes internationalisées. Elle présente également l'avantage de pouvoir placer votre texte coloré au milieu de votre ressource chaîne.

0 votes

Pour plus d'explications, voir le Stylisation avec le balisage HTML section ici .

9voto

Nanne Points 35880

Vous pouvez utiliser un Spannable pour donner à certaines parties d'un texte certains aspects. Je peux chercher un exemple si vous voulez.

Ah, à partir d'ici stackoverflow .

TextView TV = (TextView)findViewById(R.id.mytextview01); 
Spannable WordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");        
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TV.setText(WordtoSpan);

0 votes

Comment configurer les plages de début et de fin pour un texte multilingue ?

0 votes

Une idée pourrait être d'identifier le mot que vous devez mettre en évidence et de l'extraire comme une ressource de chaîne distincte. Lors de la traduction de l'expression, vous devrez envisager de mettre à jour le mot séparé de sorte que, lorsque vous définissez le span, vous vous basiez sur l'indexOf de la chaîne et la longueur de la chaîne pour définir dynamiquement les index de début et de fin du span.

4voto

Heiko Rupp Points 15153

Si vous voulez utiliser le HTML, vous devez utiliser TextView.setText(Html.fromHtml(String htmlString))

Si vous voulez faire cela souvent / de manière répétée, vous pouvez jeter un coup d'œil à une classe ( SpannableBuilder ) J'ai écrit, comme Html.fromHtml() n'est pas très efficace (il utilise une grosse machine de parsing xml). Il est décrit dans ce document affichage du blog .

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