Est-il possible de définir la couleur d'une étendue de texte dans un TextView?
J'aimerais faire quelque chose de similaire à l'application Twitter, dans laquelle une partie du texte est en bleu. Voir l'image ci-dessous:
Une autre réponse serait très similaire, mais n'aurait pas besoin de définir le texte de TextView
deux fois
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);
Voici une petite fonction d'aide. Parfait pour les langues multiples!
private void setColor(TextView view, String fulltext, String subtext, int color) {
view.setText(fulltext, TextView.BufferType.SPANNABLE);
Spannable str = (Spannable) view.getText();
int i = fulltext.indexOf(subtext);
str.setSpan(new ForegroundColorSpan(color), i, i + subtext.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
Si vous souhaitez plus de contrôle, vous pouvez vérifier la classe TextPaint
. Voici comment l'utiliser:
final ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(final View textView) {
//Your onClick code here
}
@Override
public void updateDrawState(final TextPaint textPaint) {
textPaint.setColor(yourContext.getResources().getColor(R.color.orange));
textPaint.setUnderlineText(true);
}
};
Je trouve toujours des exemples visuels utiles lorsque j'essaie de comprendre un nouveau concept.
SpannableString spannableString = new SpannableString("Hello World!");
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(backgroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
Définissez le texte de votre TextView
´ sur spannable et définissez une ForegroundColorSpan
pour votre texte.
TextView textView = (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);
textView.setText(wordtoSpan);
Une autre méthode qui peut être utilisée dans certaines situations consiste à définir la couleur du lien dans les propriétés de la vue qui prend le Spannable.
Si votre Spannable doit être utilisé dans un TextView, par exemple, vous pouvez définir la couleur du lien dans le code XML comme suit:
<TextView
Android:id="@+id/myTextView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textColorLink="@color/your_color"
</TextView>
Vous pouvez également le définir dans le code avec:
TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setLinkTextColor(your_color);
Il y a une usine pour créer le Spannable, et éviter le casting, comme ceci:
Spannable span = Spannable.Factory.getInstance().newSpannable("text");
Définir la couleur sur Texte par chaîne de passage et couleur :
private String getColoredSpanned(String text, String color) {
String input = "<font color=" + color + ">" + text + "</font>";
return input;
}
Définir le texte sur TextView/Button/EditText etc en appelant le code ci-dessous:
Affichage:
TextView txtView = (TextView)findViewById(R.id.txtView);
Get Coloured String:
String name = getColoredSpanned("Hiren", "#800000");
Définir le texte sur TextView:
txtView.setText(Html.fromHtml(name));
Terminé
String text = "I don't like Hasina.";
textView.setText(spannableString(text, 8, 14));
private SpannableString spannableString(String text, int start, int end) {
SpannableString spannableString = new SpannableString(text);
ColorStateList redColor = new ColorStateList(new int[][]{new int[]{}}, new int[]{0xffa10901});
TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, redColor, null);
spannableString.setSpan(highlightSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new BackgroundColorSpan(0xFFFCFF48), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new RelativeSizeSpan(1.5f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
Sortie:
Juste pour ajouter à la réponse acceptée, car toutes les réponses semblent parler de Android.graphics.Color
seulement: que se passe-t-il si la couleur que je veux est définie dans res/values/colors.xml
?
Par exemple, considérons Couleurs de conception du matériau définies dans colors.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="md_blue_500">#2196F3</color>
</resources>
( Android_material_design_colours.xml
est votre meilleur ami)
Ensuite, utilisez ContextCompat.getColor(getContext(), R.color.md_blue_500)
où vous utiliseriez Color.BLUE
, de sorte que:
wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
devient:
wordtoSpan.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.md_blue_500)), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Où j'ai trouvé ça:
collez ce code dans votre mainActivity
TextView textview=(TextView)findViewById(R.id.textviewid);
Spannable spannable=new SpannableString("Hello my name is sunil");
spannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 5,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textview.setText(spannable);
//Note:- the 0,5 is the size of colour which u want to give the strring
//0,5 means it give colour to starting from h and ending with space i.e.(hello), if you want to change size and colour u can easily
Voici une fonction d'extension Kotlin que j'ai pour cela
fun TextView.setColouredSpan(Word: String, color: Int) {
val spannableString = SpannableString(text)
val start = text.indexOf(Word)
val end = text.indexOf(Word) + Word.length
try {
spannableString.setSpan(ForegroundColorSpan(color), start, end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
text = spannableString
} catch (e: IndexOutOfBoundsException) {
println("'$Word' was not not found in TextView text")
}
}
Utilisez-le après avoir défini votre texte sur TextView
private val blueberry by lazy { getColor(R.color.blueberry) }
textViewTip.setColouredSpan("Warning", blueberry)