Ändern Sie die Textfarbe eines Wortes in einer Textansicht


97

Ich suche nach einer Möglichkeit, die Farbe eines Textes eines einzelnen Wortes in einem TextViewvon innerhalb eines zu ändern Activity.

Zum Beispiel damit:

String first = "This word is ";
String next = "red"
TextView t = (TextView) findViewById(R.id.textbox);
t.setText(first + next);

Wie würde ich die Farbe des nextTextes in Rot ändern ?




Antworten:


172

Der einfachste Weg, den ich kenne, ist, einfach HTML zu verwenden.

String first = "This word is ";
String next = "<font color='#EE0000'>red</font>";
t.setText(Html.fromHtml(first + next));

Dazu müssen Sie jedoch die Textansicht neu erstellen, wenn Sie (falls?) Die Farbe ändern möchten, was zu Problemen führen kann.


1
Dies ist definitiv der einfachste Weg, aber sollte die Farbe nicht color = '# EE0000' sein, wird das Pfundsymbol benötigt, um eine hexadezimale Farbe zu kennzeichnen.
Tom

Behoben, danke! Ich kann mich nicht erinnern, ob ich dies aus dem tatsächlichen Code oder aus dem Speicher mit einer Farbgenerator-Website kopiert habe, sodass es möglicherweise vorher nicht funktioniert hat.
Dan

Ok, nur um sicher zu gehen! Wie ich herausgefunden habe, können Sie auch keine 8-stelligen Hex-Codes verwenden, also keine Alpha-Komponente. Dieser hat mich für einen Moment verblüfft.
Tom

Verwendung fromHtmlist jetzt veraltet
Alex Jolig

Html.fromHtmlist veraltet. Diese Lösung hat bei mir funktioniert!
Coderpc

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

Sie müssen spannable verwenden. Dies ermöglicht es Ihnen auch, die Größe eines Textes zu erhöhen, ihn fett zu machen usw. ... sogar ein Bild einzufügen.


4
Gute Antwort, danke. In diesem Fall kann "s.length ()" anstelle von "start + next.length ()" verwendet werden: int end = s.length ();
Oleg

1
Für den Fall, dass jemand nach Xamarin.Android Solution sucht. Sie können ein SpannableStringObjekt zuweisen , indem Sie die TextFormattedEigenschaft Ihres Steuerelements verwenden.
Jamshaid Kamran

Konnte das nicht zum Laufen bringen. Endete mit der Lösung von BK.
2b77bee6-5445-4c77-b1eb-4df3e5

1. Wenn es einen Build gibt, ist es immer besser, ihn zu verwenden. 2. Was hat bei dir nicht funktioniert? Diese Lösung ist alt, sehr alt, einige APIs haben sich geändert, hinzugefügt, entfernt, Fehler behoben. Was genau hat nicht funktioniert?
CodeScriber

2
Ich bekomme einen java.lang.String cannot be cast to android.text.SpannableFehler.
Lashgar

37

Verwenden Sie SpannableStringBuilder wie folgt:

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

Gibt es etwas, durch das ich ersetzen kann new ForegroundColorSpan(Color), damit der Text seine ursprüngliche Standardfarbe beibehält?
cjnash

Wie füge ich einfachen Text (String) in der Mitte der Textansicht hinzu?
Ragavendra M

5

Für lange Saiten können Sie Folgendes verwenden:

String help = getString(R.string.help);
help = help.replace("some word", "<font color='#EE0000'>some word</font>");
txtDesc.setText(Html.fromHtml(help));

2

Wenn Sie den Status aller Instanzen eines bestimmten Textes Stringin einem TextViewText ändern möchten (ohne Berücksichtigung der Groß- und Kleinschreibung), können Sie StringBuilders verwenden und SpannableStringFolgendes tun:

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

}}

  • Speichern Sie den gesamten TextViewText in a StringBuilder.
  • Speichern Sie die gesuchte Zeichenfolge in a StringBuilder.
  • Speichern Sie den gesamten TextViewText in aSpannableString
  • Machen Sie eine einfache Operation, um alle StringInstanzen im TextViewText zu finden und sie zu ändern, wenn sie erreicht sind.
  • Stellen Sie den Textwert von TextViewauf SpannableString.

1

Ich habe in Kotlin eine Utility-Funktion für meinen eigenen Anwendungsfall implementiert, die möglicherweise für eine andere Person nützlich ist.

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)
            }

Wie ich es benutze:

context?.let {
        infoMessage.text = AppUtils.getCusomTextWithSpecificTextWithDiffColor(
                wordAsBold,
                completeSentence, ContextCompat.getColor(it, R.color.white))
    }

1

VERWENDEN:

makeTextBold("Your order is accepted","accepted", textView);
makeTextBold("Your order is canceled","canceled", textView);

Funktion:

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

Ich denke, dies ist besser lesbar, um ein Wort in einer Zeichenfolge zu färben. Es ist wahrscheinlich auch ein bisschen effizienter, weil Sie einmal schreiben

    String str  = YOUR_STRING
    Spannable s = new SpannableString(str);
    int start = str.indexOf(err_word_origin);
    int end =  start + err_word_origin.length();
    s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    YOUR_TEXT_VIEW.setText(s , TextView.BufferType.SPANNABLE);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.