web-dev-qa-db-fra.com

Changer la couleur du texte d'un mot dans un TextView

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?

83
cerealspiller

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.

158
Dan
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.

71
codeScriber

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);
28
Biswajit Karmakar

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 StringBuilders 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);

}

  • Stockez le texte entier TextView à l'intérieur d'un StringBuilder.
  • Stocker la chaîne recherchée dans un StringBuilder.
  • Stocker le texte entier TextView à l'intérieur d'un SpannableString
  • Effectuez une opération simple pour rechercher toutes les instances String dans le texte TextView et les modifier lorsque vous les atteignez.
  • Définissez la valeur textuelle de TextView sur SpannableString.
2
God

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));
2
Maysam R

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))
    }
1
Wahib Ul Haq

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);
}
0
Ketan Ramani