Ä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 ?

Getreidespiller
quelle
stackoverflow.com/questions/9754076/…
Ciro Santilli 法轮功 冠状 冠状 病 六四

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.

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

codeScriber
quelle
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);
Biswajit Karmakar
quelle
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));
Maysam R.
quelle
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.
Gott
quelle
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))
    }
Wahib Ul Haq
quelle
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);
}
Ketan Ramani
quelle
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);
sivi
quelle