TextView único com vários textos coloridos


167

Como o título diz, quero saber se é possível obter dois caracteres coloridos diferentes em um único elemento de visualização de texto.



1
Não é duplicado, pois o solicitante está pedindo cores especificamente.
Iqbal


i ter escreveu alguma biblioteca também que ter um comportamento semelhante a esta: github.com/ha-yi/MultiColorTextView
Hayi Nukman

Respostas:


328

sim, se você formatar o Stringcom html's font-colorpropriedade, em seguida, passá-lo para o métodoHtml.fromHtml(your text here)

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

Obrigado também útil para mim. +1
Hardik Joshi

10
Não se esqueça de escapar da entrada do usuário usando Html.escapeHtml(str).
precisa saber é o seguinte

1
Adicionado na API nível 1
2red13

3
Apenas um aviso. Eu estava tendo um problema quando precisava que meu texto estivesse em maiúsculas. Eu estava usando android: textAllCaps = "true" em XML e, ao mesmo tempo, tinha meu conteúdo HTML em maiúsculas. Não estava funcionando. Eu removi o atributo XML e agora está funcionando bem. Cuidado, pois se você usar setAllCaps () no código, o mesmo problema será exibido.
Joao2fast4u

5
Html.fromHtml(String)agora está obsoleto; em vez disso, use Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY). Mais informações podem ser encontradas aqui.
JediBurrell 28/02

165

Você pode imprimir linhas com várias cores sem HTML como:

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

ótimo, obrigado, também pode fazer BackgroundColorSpan. existe um pequeno erro de digitação no seu exemplo, WordToSpan e WordtoSpan, observe o caso em To
steveh

como se faz para unidade testar o textview para garantir que as extremidades de texto em Color.red stackoverflow.com/questions/26611533/...
sudocoder

1
Não está funcionando para mim, recebendo `java.lang.StringIndexOutOfBoundsException: length = 3; index = 12`
Muhammad Babar

1
StringIndexOutOfBoundsException em si explicativo. Você está acessando a string além do comprimento.
Swapnil Kotwal

1
Minhas seqüências de caracteres não foram corrigidas; portanto, elas seriam geradas no tempo de execução do aplicativo. Eu tentei quase todas as respostas desta pergunta. Mas apenas essa solução funcionou para mim.
Sr. Sabbir Ahmed, 15/04/19

33

Você pode usar Spannablepara aplicar efeitos ao seuTextView :

Aqui está o meu exemplo para colorir apenas a primeira parte de um TextViewtexto (enquanto permite que você defina a cor dinamicamente, em vez de codificá-la em uma String, como no exemplo 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);

Neste exemplo, você pode substituir 0xFFFF0000 por um getResources().getColor(R.color.red)


1
Se você precisar dessa letra maiúscula, basta acessar UpperCase () as Strings.
Graeme

33

Eu fiz assim:

Verificar referência

Jogo de cor no texto pela passagem de Cordas e cor :

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

Defina o texto no TextView / Button / EditText etc chamando o código abaixo:

TextView:

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

Obter sequência colorida:

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

Defina Texto no TextView de duas seqüências de caracteres com cores diferentes:

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

Feito


1
nyc one, mas o HTml.fromHtml foi preterido da API 24
Anuraj R 28/17/17

Você pode substituir chamadas Html.fromHtml("...")por chamadas paraHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
stkent 04/04

31

Use 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

Ei pessoal, eu fiz isso, tente

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 de sua classe TextViewUtils, adicione este método

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

Eu atualizei agora, verifique uma vez, está funcionando para mim.
Abdul Rizwan

Myabe você usa Html.fromHtml para usar esta string?
Sergey Shustikov

dentro do arquivo string.xml Eu criei uma variável e defini isso, está funcionando para mim agora. Estou fazendo isso, você pode fornecer sua string aqui.
Abdul Rizwan

5

É melhor usar a string no arquivo de strings, assim:

    <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

Eu escrevi algum código para outra pergunta que é semelhante a esta, mas essa pergunta foi duplicada, por isso não posso responder por isso, estou apenas colocando meu código aqui se alguém estiver procurando pelo mesmo requisito.

Não é um código totalmente funcional, você precisa fazer pequenas alterações para que ele funcione.

Aqui está o código:

Eu usei a ideia do @Graeme de usar texto que pode ser expandido.

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

Método de cor aleatória:

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

2

Tente o seguinte:

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

2

Use a classe SpannableBuilder em vez da formatação HTML sempre que possível, porque é mais rápida que a análise do formato HTML. Veja meu próprio benchmark "SpannableBuilder vs HTML" no Github Obrigado!


1

Respostas impressionantes! Consegui usar o Spannable para criar texto colorido arco-íris (para que isso pudesse ser repetido para qualquer matriz de cores). Aqui está o meu método, se ajudar alguém:

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 então eu apenas setText (buildRainboxText (pack_name)); Observe que todas as palavras que eu passo são menores de 15 caracteres e isso apenas repete 5 cores 3 vezes - convém ajustar as cores / comprimento da matriz para seu uso!


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

para 24 API e mais (sinalizador)

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;

Mais informações


1

Desde a API 24, você tem FROM_HTML_OPTION_USE_CSS_COLORS para poder definir cores no CSS em vez de repeti-lo o tempo todo com font color=" muito mais claro - quando você tem um html e deseja destacar algumas tags predefinidas - basta adicionar fragmento de CSS na parte superior do html


0

25 de junho de 2020 por @canerkaseler

Gostaria de compartilhar a resposta 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
}

Depois, chame a função acima. Você pode ligar para mais de um:

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

Saída: você pode ver cores sublinhadas e diferentes entre si.

@canerkaseler

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.