TextView singolo con testo colorato multiplo


168

Come dice il titolo, voglio sapere se è possibile ottenere due diversi caratteri colorati in un singolo elemento di visualizzazione di testo.



1
Non è duplicato poiché il richiedente chiede specificamente il colore.
Iqbal,


ho anche scritto alcune librerie che hanno un comportamento simile a questo: github.com/ha-yi/MultiColorTextView
Hayi Nukman,

Risposte:


328

sì, se si formatta la Stringcon la html's font-colorproprietà poi passarlo al metodoHtml.fromHtml(your text here)

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

Grazie anche utile per me. +1
Hardik Joshi,

10
Non dimenticare di sfuggire a input utente utilizzando Html.escapeHtml(str).
Kelunik,

1
Aggiunto in api livello 1
rosso

3
Solo un avvertimento. Ho avuto un problema quando avevo bisogno che il mio testo fosse in maiuscolo. Stavo usando Android: textAllCaps = "true" in XML e, allo stesso tempo, avevo il mio contenuto HTML in maiuscolo. Non funzionava Ho rimosso l'attributo XML e ora funziona bene. Fai attenzione, perché se usi setAllCaps () nel codice, apparirà lo stesso problema.
joao2fast4u,

5
Html.fromHtml(String)è ora deprecato, invece usa Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY). Ulteriori informazioni possono essere trovate qui.
JediBurrell,

165

Puoi stampare linee con più colori senza HTML come:

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

ottimo, grazie, puoi anche fare BackgroundColorSpan. c'è un piccolo errore di battitura nel tuo esempio, WordToSpan e WordtoSpan, nota il caso su To
steveh

come si fa di test di unità il TextView al fine di garantire che le estremità di testo in Color.Red stackoverflow.com/questions/26611533/...
sudocoder

1
Non funziona per me ottenere `java.lang.StringIndexOutOfBoundsException: length = 3; indice = 12`
Muhammad Babar il

1
StringIndexOutOfBoundsException stessa esplicativa. Stai accedendo alla stringa oltre la sua lunghezza.
Swapnil Kotwal,

1
Le mie stringhe non erano fisse, quindi le stringhe si generavano in fase di esecuzione dell'app. Ho provato quasi tutte le risposte a questa domanda. Ma solo questa soluzione ha funzionato per me.
Md. Sabbir Ahmed,

33

È possibile utilizzare Spannableper applicare effetti a TextView:

Ecco il mio esempio per colorare solo la prima parte di un TextViewtesto (permettendoti di impostare il colore in modo dinamico piuttosto che codificarlo in una stringa come nell'esempio HTML!)

    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 questo esempio è possibile sostituire 0xFFFF0000 con a getResources().getColor(R.color.red)


1
Se hai bisogno di questo maiuscolo, semplicemente toUpperCase () the Strings.
Graeme,

33

Ho fatto così:

Verifica riferimento

Imposta colore sul testo per passare String e colore :

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

Imposta il testo su TextView / Button / EditText ecc chiamando il codice seguente:

TextView:

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

Ottieni una stringa colorata:

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

Imposta testo su TextView di due stringhe con colori diversi:

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

Fatto


1
nyc one, ma HTml.fromHtml è deprecato dall'API 24
Anuraj R

Puoi sostituire le chiamate Html.fromHtml("...")con le chiamate aHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
stkent

31

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

8

Ehi ragazzi, l'ho fatto, provatelo

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

Dentro di te la classe TextViewUtils aggiungi questo metodo

 /***
 *
 * @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;
}

Ho aggiornato proprio ora, controllalo una volta, funziona per me.
Abdul Rizwan,

Myabe usi Html.fromHtml per usare questa stringa?
Sergey Shustikov,

all'interno del file string.xml Ho creato la variabile e impostato questo, funziona per me proprio ora che sto facendo questo, puoi per favore dare la tua stringa qui.
Abdul Rizwan,

5

È meglio usare la stringa nel file string, in quanto tale:

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

Uso:

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

4

Ho scritto del codice per un'altra domanda che è simile a questa, ma quella domanda è stata duplicata, quindi non posso rispondere lì, quindi inserisco il mio codice qui se qualcuno cerca lo stesso requisito.

Non è un codice completamente funzionante, è necessario apportare alcune modifiche minori per farlo funzionare.

Ecco il codice:

Ho usato l'idea di @Graeme di usare un testo analizzabile.

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

Metodo di colore casuale:

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

2

Prova questo:

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

2

Usa la classe SpannableBuilder invece della formattazione HTML dove possibile perché è più veloce dell'analisi del formato HTML. Vedi il mio benchmark "SpannableBuilder vs HTML" su Github Grazie!


1

Risposte fantastiche! Sono stato in grado di utilizzare Spannable per creare testo di colore arcobaleno (quindi questo potrebbe essere ripetuto per qualsiasi gamma di colori). Ecco il mio metodo, se aiuta qualcuno:

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

E poi ho appena impostatoText (buildRainboxText (nome_pacchetto)); Nota che tutte le parole che passo sono sotto i 15 caratteri e questo ripete solo 3 colori per 3 volte - ti consigliamo di regolare i colori / lunghezza dell'array per il tuo utilizzo!


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

per 24 API e altro (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;

Ulteriori informazioni


1

Dall'API 24 hai FROM_HTML_OPTION_USE_CSS_COLORS in modo da poter definire i colori nei CSS invece di ripeterli sempre con font color=" molto più chiaro - quando hai qualche HTML e vuoi evidenziare alcuni tag predefiniti - devi solo aggiungere frammento CSS in cima al tuo HTML


0

25 giugno 2020 di @canerkaseler

Vorrei condividere la risposta di Kotlin :

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
}

Dopo, chiama la funzione sopra. Puoi chiamarne più di uno:

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

Output: puoi vedere sottolineati e colori diversi tra loro.

@canerkaseler

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.