webentwicklung-frage-antwort-db.com.de

Einzelne Textansicht mit mehrfarbigem Text

Wie der Titel sagt, möchte ich wissen, dass es möglich ist, zwei verschiedene farbige Zeichen in einem einzigen Textansicht-Element zu erhalten.

150
Andro Selva

ja, wenn Sie die String mit der font-color-Eigenschaft von html formatieren, übergeben Sie sie an die Methode Html.fromHtml(your text here)

String text = "<font color=#cc0029>First Color</font> <font color=#ffcc00>Second Color</font>";
yourtextview.setText(Html.fromHtml(text));
301
2red13

Sie können Zeilen mit mehreren Farben ohne HTML-Code drucken als:

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);
144
Swapnil Kotwal

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

Hier ist mein Beispiel, um nur den ersten Teil eines TextView-Texts einzufärben (wobei Sie die Farbe dynamisch festlegen können, statt sie hart wie in einem HTML-Beispiel in einen String zu kodieren!)

    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 eine getResources().getColor(R.color.red) ersetzen.

30
Graeme

Ich habe diesen Weg gemacht:

 Check reference

Setze Farbe auf Text durch Durchlauf String und Farbe:

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

Setzen Sie Text auf TextView/Button/EditText usw., indem Sie den folgenden Code aufrufen:

Textvorschau:

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

Farbige Zeichenfolge abrufen:

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

Text in TextView von zwei Strings mit unterschiedlichen Farben setzen:

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

Erledigt

28
Hiren Patel

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

Hey Leute, ich habe das getan, probiere es  

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

In deiner TextViewUtils-Klasse füge 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;
}
6
Abdul Rizwan

Ich habe etwas Code für eine andere Frage aufgeschrieben, die dieser ähnelt, aber diese Frage wurde dupliziert, so dass ich nicht dort antworten kann, also setze ich meinen Code hier ein, wenn jemand dieselbe Anforderung sucht.

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

Hier ist der Code:

Ich habe die Idee von @Graeme verwendet, um 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));
    }
4
NaserShaikh

Verwenden Sie die Klasse "SpannableBuilder" anstelle der HTML-Formatierung, sofern dies schneller möglich ist als das Analysieren im HTML-Format ..__ Siehe meinen eigenen Benchmark "SpannableBuilder vs HTML" unter Github Vielen Dank!

2
Anatoliy Shuba
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

1
Ahmad Aghazadeh

Versuche dies:

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

Tolle Antworten! Ich konnte Spannable verwenden, um regenbogenfarbenen Text zu erstellen (dies könnte also für jedes Farbfeld wiederholt werden). Hier ist meine Methode, wenn es 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 einfach setText (buildRainboxText (pack_name)); Beachten Sie, dass alle Wörter, die ich übergebe, aus weniger als 15 Zeichen bestehen und dies nur 5 Farben dreimal wiederholt für Ihren Gebrauch!

0
Casey Murray

Seit API 24 haben Sie FROM_HTML_OPTION_USE_CSS_COLORS, sodass Sie Farben in CSS definieren können, anstatt sie immer wieder mit font color=" zu wiederholen. Viel klarer: Wenn Sie HTML haben und einige vordefinierte Tags hervorheben möchten, müssen Sie lediglich ein CSS-Fragment hinzufügen oben auf Ihrem HTML

0
Filipkowicz

Es ist besser, den String in der String-Datei zu verwenden:

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

Verwendungszweck:

textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)
0