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.

Andro Selva
fonte
3
possível duplicação de É possível ter vários estilos dentro de um TextView?
23711 dogbane
1
Não é duplicado, pois o solicitante está pedindo cores especificamente.
Iqbal
Existe uma boa biblioteca para isso, eu acho: blog.stylingandroid.com/rialto-downloadable-fonts github.com/StylingAndroid/Rialto
desenvolvedor android
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));
2red13
fonte
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);
Swapnil Kotwal
fonte
ó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)

Graeme
fonte
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

Hiren Patel
fonte
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);
Biswajit Karmakar
fonte
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;
}
Abdul Rizwan
fonte
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)
desenvolvedor android
fonte
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));
    }
NaserShaikh
fonte
2

Tente o seguinte:

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
      "<small>" + description + "</small>" + "<br />" + 
      "<small>" + DateAdded + "</small>"));
user3579830
fonte
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!

Anatoliy Shuba
fonte
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!

Casey Murray
fonte
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

Ahmad Aghazadeh
fonte
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

Filipkowicz
fonte
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

canerkaseler
fonte