Einzelne Textansicht mit mehrfarbigem Text

167

Wie der Titel schon sagt, möchte ich wissen, ob es möglich ist, zwei verschiedenfarbige Zeichen in einem einzigen Textansichtselement zu erzielen.

Andro Selva
quelle
1
Es ist kein Duplikat, da der Fragesteller speziell nach Farbe fragt.
Iqbal
Es gibt eine schöne Bibliothek dafür, denke ich: blog.stylingandroid.com/rialto-downloadable-fonts github.com/StylingAndroid/Rialto
Android-Entwickler
Ich habe auch eine Bibliothek geschrieben, die sich ähnlich
verhält

Antworten:

328

Ja, wenn Sie die Eigenschaft Stringwith html's formatieren, übergeben Sie font-colorsie an die MethodeHtml.fromHtml(your text here)

String text = "<font color=#cc0029>First Color</font> <font color=#ffcc00>Second Color</font>";
yourtextview.setText(Html.fromHtml(text));
2red13
quelle
Danke auch hilfreich für mich. +1
Hardik Joshi
10
Vergessen Sie nicht, sich der Benutzereingabe mit zu entziehen Html.escapeHtml(str).
Kelunik
1
Hinzugefügt in API Level 1
2red13
3
Nur eine Warnung. Ich hatte ein Problem, als mein Text in Großbuchstaben geschrieben werden musste. Ich habe android: textAllCaps = "true" in XML verwendet und gleichzeitig meinen HTML-Inhalt in Großbuchstaben geschrieben. Es hat nicht funktioniert. Ich habe das XML-Attribut entfernt und es funktioniert jetzt einwandfrei. Seien Sie vorsichtig, denn wenn Sie setAllCaps () im Code verwenden, tritt dasselbe Problem auf.
Joao2fast4u
5
Html.fromHtml(String)ist jetzt veraltet, stattdessen verwenden Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY). Weitere Informationen finden Sie hier.
JediBurrell
165

Sie können Linien mit mehreren Farben ohne HTML wie folgt drucken:

TextView textView = (TextView) findViewById(R.id.mytextview01);
Spannable word = new SpannableString("Your message");        

word.setSpan(new ForegroundColorSpan(Color.BLUE), 0, word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

textView.setText(word);
Spannable wordTwo = new SpannableString("Your new message");        

wordTwo.setSpan(new ForegroundColorSpan(Color.RED), 0, wordTwo.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(wordTwo);
Swapnil Kotwal
quelle
super, danke, kann auch BackgroundColorSpan machen. gibt es einen kleinen Tippfehler in Ihrem Beispiel WordToSpan und WordtoSpan, notieren Sie den Fall auf , um
SteveH
Wie geht man vor, um die Textansicht zu testen, um sicherzustellen, dass der Text in Color.RED stackoverflow.com/questions/26611533/…
sudocoder
1
Funktioniert nicht für mich, wenn ich `java.lang.StringIndexOutOfBoundsException erhalte: length = 3; index = 12`
Muhammad Babar
1
StringIndexOutOfBoundsException selbst erklärt. Sie greifen auf Zeichenfolgen zu, die über die Länge hinausgehen.
Swapnil Kotwal
1
Meine Zeichenfolgen wurden nicht festgelegt, sodass Zeichenfolgen zur Laufzeit der App generiert wurden. Ich habe fast alle Antworten auf diese Frage ausprobiert. Aber nur diese Lösung hat bei mir funktioniert.
Md. Sabbir Ahmed
33

Sie können verwenden Spannable, um Effekte auf Ihre TextView:

Hier ist mein Beispiel für das Färben nur des ersten Teils eines TextViewTextes (während Sie die Farbe dynamisch einstellen können, anstatt sie wie im HTML-Beispiel hart in einen String zu codieren!)

    mTextView.setText("Red text is here", BufferType.SPANNABLE);
    Spannable span = (Spannable) mTextView.getText();
    span.setSpan(new ForegroundColorSpan(0xFFFF0000), 0, "Red".length(),
             Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

In diesem Beispiel können Sie 0xFFFF0000 durch a ersetzen getResources().getColor(R.color.red)

Graeme
quelle
1
Wenn Sie diesen Großbuchstaben benötigen, toUpperCase () einfach die Zeichenfolgen.
Graeme
33

Ich habe so gemacht:

Referenz prüfen

Stellen Sie die Farbe auf Text ein, indem Sie String und Farbe übergeben :

private String getColoredSpanned(String text, String color) {
    String input = "<font color=" + color + ">" + text + "</font>";
    return input;
}

Stellen Sie Text in TextView / Button / EditText usw. ein, indem Sie den folgenden Code aufrufen:

Textübersicht:

TextView txtView = (TextView)findViewById(R.id.txtView);

Farbige Zeichenfolge abrufen:

String name = getColoredSpanned("Hiren", "#800000");
String surName = getColoredSpanned("Patel","#000080");

Stellen Sie Text in TextView aus zwei Zeichenfolgen mit unterschiedlichen Farben ein:

txtView.setText(Html.fromHtml(name+" "+surName));

Getan

Hiren Patel
quelle
1
nyc one, aber die HTml.fromHtml ist von API 24
Anuraj R
Sie können Anrufe an Html.fromHtml("...")durch Anrufe anHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
stkent
31

Verwenden Sie SpannableStringBuilder

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
8

Hey Leute, ich habe das getan, probier es aus

TextView textView=(TextView)findViewById(R.id.yourTextView);//init

//here I am appending two string into my textView with two diff colors.
//I have done from fragment so I used here getActivity(), 
//If you are trying it from Activity then pass className.this or this; 

textView.append(TextViewUtils.getColoredString(getString(R.string.preString),ContextCompat.getColor(getActivity(),R.color.firstColor)));
textView.append(TextViewUtils.getColoredString(getString(R.string.postString),ContextCompat.getColor(getActivity(),R.color.secondColor)));

Fügen Sie in Ihrer TextViewUtils-Klasse diese Methode hinzu

 /***
 *
 * @param mString this will setup to your textView
 * @param colorId  text will fill with this color.
 * @return string with color, it will append to textView.
 */
public static Spannable getColoredString(String mString, int colorId) {
    Spannable spannable = new SpannableString(mString);
    spannable.setSpan(new ForegroundColorSpan(colorId), 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    Log.d(TAG,spannable.toString());
    return spannable;
}
Abdul Rizwan
quelle
Ich habe gerade aktualisiert, überprüfe es einmal, es funktioniert für mich.
Abdul Rizwan
Myabe Sie verwenden Html.fromHtml für die Verwendung dieser Zeichenfolge?
Sergey Shustikov
In der Datei string.xml habe ich eine Variable erstellt und diese festgelegt. Sie funktioniert gerade für mich. Ich mache das. Können Sie bitte Ihre Zeichenfolge hier angeben?
Abdul Rizwan
5

Es ist besser, die Zeichenfolge in der Zeichenfolgendatei als solche zu verwenden:

    <string name="some_text">
<![CDATA[
normal color <font color=\'#06a7eb\'>special color</font>]]>
    </string>

Verwendung:

textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)
Android-Entwickler
quelle
4

Ich habe einen Code für eine andere Frage aufgeschrieben, die dieser ähnlich ist, aber diese Frage wurde dupliziert, sodass ich sie dort nicht beantworten kann. Ich setze meinen Code nur hier ein, wenn jemand nach derselben Anforderung sucht.

Der Code funktioniert nicht vollständig. Sie müssen einige geringfügige Änderungen vornehmen, damit er funktioniert.

Hier ist der Code:

Ich habe die @ Graeme-Idee verwendet, spannbaren Text zu verwenden.

String colorfulText = "colorfulText";       
    Spannable span = new SpannableString(colorfulText);             

    for ( int i = 0, len = colorfulText.length(); i < len; i++ ){
        span.setSpan(new ForegroundColorSpan(getRandomColor()), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);                     
    }   

    ((TextView)findViewById(R.id.txtSplashscreenCopywrite)).setText(span);

Zufällige Farbmethode:

  private int getRandomColor(){
        Random rnd = new Random();
        return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
    }
NaserShaikh
quelle
2

Versuche dies:

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
      "<small>" + description + "</small>" + "<br />" + 
      "<small>" + DateAdded + "</small>"));
user3579830
quelle
2

Verwenden Sie die SpannableBuilder-Klasse anstelle der HTML-Formatierung, sofern dies möglich ist, da sie schneller als das Parsen des HTML-Formats ist. Siehe meinen eigenen Benchmark "SpannableBuilder vs HTML" auf Github Danke!

Anatoliy Shuba
quelle
1

Tolle Antworten! Ich konnte Spannable verwenden, um regenbogenfarbenen Text zu erstellen (dies konnte also für jede Reihe von Farben wiederholt werden). Hier ist meine Methode, wenn sie jemandem hilft:

private Spannable buildRainbowText(String pack_name) {
        int[] colors = new int[]{Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE};
        Spannable word = new SpannableString(pack_name);
        for(int i = 0; i < word.length(); i++) {
            word.setSpan(new ForegroundColorSpan(colors[i]), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return word;
    }

Und dann setze ich einfachText (buildRainboxText (pack_name)); Beachten Sie, dass alle Wörter, die ich eingebe, weniger als 15 Zeichen enthalten und dies nur dreimal 5 Farben wiederholt - Sie möchten die Farben / Länge des Arrays für Ihre Verwendung anpassen!

Casey Murray
quelle
1
if (Build.VERSION.SDK_INT >= 24) {
     Html.fromHtml(String, flag) // for 24 API  and more
 } else {
     Html.fromHtml(String) // or for older API 
 }

für 24 API und mehr (Flag)

public static final int FROM_HTML_MODE_COMPACT = 63;
public static final int FROM_HTML_MODE_LEGACY = 0;
public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1;
public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0;
public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1;

Mehr Info

Ahmad Aghazadeh
quelle
1

Seit API 24 haben Sie FROM_HTML_OPTION_USE_CSS_COLORS, sodass Sie Farben in CSS definieren können, anstatt sie ständig zu wiederholen. font color=" Wenn Sie etwas HTML haben und einige vordefinierte Tags hervorheben möchten, müssen Sie nur das CSS-Fragment oben in Ihrem HTML hinzufügen

Filipkowicz
quelle
0

25. Juni 2020 von @canerkaseler

Ich möchte Kotlin teilen Antwort :

fun setTextColor(tv:TextView, startPosition:Int, endPosition:Int, color:Int){
    val spannableStr = SpannableString(tv.text)

    val underlineSpan = UnderlineSpan()
    spannableStr.setSpan(
        underlineSpan,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    val backgroundColorSpan = ForegroundColorSpan(this.resources.getColor(R.color.agreement_color))
    spannableStr.setSpan(
        backgroundColorSpan,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    val styleSpanItalic = StyleSpan(Typeface.BOLD)
    spannableStr.setSpan(
        styleSpanItalic,
        startPosition,
        endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    )

    tv.text = spannableStr
}

Rufen Sie danach die obige Funktion auf. Sie können mehrere anrufen:

setTextColor(textView, 0, 61, R.color.agreement_color)
setTextColor(textView, 65, 75, R.color.colorPrimary)

Ausgabe: Sie können Unterstreichungen und verschiedene Farben miteinander sehen.

@canerkaseler

canerkaseler
quelle