Je cherche un moyen de changer la couleur d'un texte d'un seul mot dans un TextView
à partir d'un Activity
.
Par exemple, avec ceci:
String first = "This Word is ";
String next = "red"
TextView t = (TextView) findViewById(R.id.textbox);
t.setText(first + next);
Comment pourrais-je changer la couleur du texte next
en rouge?
Le moyen le plus simple que je connaisse consiste simplement à utiliser le langage HTML.
String first = "This Word is ";
String next = "<font color='#EE0000'>red</font>";
t.setText(Html.fromHtml(first + next));
Mais cela nécessitera de reconstruire le TextView lorsque (si?) Vous souhaitez modifier la couleur, ce qui pourrait causer des problèmes.
t.setText(first + next, BufferType.SPANNABLE);
Spannable s = (Spannable)t.getText();
int start = first.length();
int end = start + next.length();
s.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
vous devez utiliser spannable, cela vous permet également d'augmenter la taille de certains textes, de les mettre en gras, etc., même de les insérer dans une image.
Utilisez SpannableStringBuilder comme ceci:
SpannableStringBuilder builder = new SpannableStringBuilder();
SpannableString str1= new SpannableString("Text1");
str1.setSpan(new ForegroundColorSpan(Color.RED), 0, str1.length(), 0);
builder.append(str1);
SpannableString str2= new SpannableString(appMode.toString());
str2.setSpan(new ForegroundColorSpan(Color.GREEN), 0, str2.length(), 0);
builder.append(str2);
TextView tv = (TextView) view.findViewById(Android.R.id.text1);
tv.setText( builder, TextView.BufferType.SPANNABLE);
Si vous souhaitez modifier l'état de toutes les occurrences d'un String
spécifique dans un texte TextView
(insensible à la casse), vous pouvez utiliser StringBuilder
s et SpannableString
comme cette:
StringBuilder textBuilder = new StringBuilder(myTextView.getText().toString());
StringBuilder searchedTextBuilder = new StringBuilder((mySearchedString));
SpannableString spannableString = new SpannableString(myTextView.getText().toString());
int counter = 0;
int index = 0;
for (int i = 0;i < textBuilder.length() - mySearchedString.length() - 1;i++)
{
counter = 0;
if (Character.toLowerCase(textBuilder.charAt(i)) == Character.toLowerCase(searchedTextBuilder.charAt(index)))
{
counter++;
index++;
for (int j = 1,z = i + 1;j < mySearchedString.length() - 1;j++,z++)
{
if (Character.toLowerCase(textBuilder .charAt(z)) == Character.toLowerCase(searchedTextBuilder .charAt(index)))
{
counter++;
index++;
}
else
{
index++;
if (index % mySearchedString.length() == 0)
{
index = 0;
}
break;
}
}
if (counter == mySearchedString.length() - 1) // A match
{
spannableString.setSpan(new ForegroundColorSpan(Color.RED), i,
i + mySearchedString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Do the change you want(In this case changing the fore ground color to red)
index = 0;
continue;
}
else
{
index = 0;
continue;
}
}
}
myTextView.setText(spannableString);
}
TextView
à l'intérieur d'un StringBuilder
.StringBuilder
.TextView
à l'intérieur d'un SpannableString
String
dans le texte TextView
et les modifier lorsque vous les atteignez.TextView
sur SpannableString
.pour une longue chaîne, vous pouvez utiliser ceci:
String help = getString(R.string.help);
help = help.replace("some Word", "<font color='#EE0000'>some Word</font>");
txtDesc.setText(Html.fromHtml(help));
J'ai mis en œuvre une fonction d'utilitaire dans Kotlin pour mon propre cas d'utilisation et peut-être utile pour quelqu'un d'autre.
fun getCusomTextWithSpecificTextWithDiffColor(textToBold: String, fullText: String,
targetColor: Int) =
SpannableStringBuilder(fullText).apply {
setSpan(ForegroundColorSpan(targetColor),
fullText.indexOf(textToBold),
(fullText.indexOf(textToBold) + textToBold.length),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
Comment je l'utilise:
context?.let {
infoMessage.text = AppUtils.getCusomTextWithSpecificTextWithDiffColor(
wordAsBold,
completeSentence, ContextCompat.getColor(it, R.color.white))
}
SE:
makeTextBold("Your order is accepted","accepted", textView);
makeTextBold("Your order is canceled","canceled", textView);
Fonction:
public static void makeTextBold(String sentence, String Word, AppCompatTextView textView) {
SpannableStringBuilder builder = new SpannableStringBuilder();
int startIndex = sentence.indexOf(Word.toLowerCase().trim());
int endIndex = startIndex + Word.toLowerCase().trim().length();
SpannableString spannableString = new SpannableString(sentence);
StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
spannableString.setSpan(boldSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To make text Bold
spannableString.setSpan(new ForegroundColorSpan(Color.RED), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //To change color of text
builder.append(spannableString);
textView.setText(builder, TextView.BufferType.SPANNABLE);
}