web-dev-qa-db-fra.com

TextView unique avec du texte multicolore

Comme le titre l'indique, j'aimerais savoir s'il est possible d'obtenir deux caractères de couleur différente dans un seul élément textview.

150
Andro Selva

oui, si vous formatez la String avec la propriété html's font-color, transmettez-la à la méthode 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

Vous pouvez imprimer des lignes à plusieurs couleurs sans HTML comme:

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

Vous pouvez utiliser Spannable pour appliquer des effets à votre TextView:

Voici mon exemple pour colorier uniquement la première partie d'un texte TextView (tout en vous permettant de définir la couleur de manière dynamique plutôt que de la coder en dur dans une chaîne comme dans l'exemple 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);

Dans cet exemple, vous pouvez remplacer 0xFFFF0000 par un getResources().getColor(R.color.red)

30
Graeme

J'ai fait comme ça:

 Check reference

Définissez Color sur Text en en passant String et color:

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

Définissez le texte sur TextView/Button/EditText, etc. en appelant le code ci-dessous:

Affichage:

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

Get Coloured String:

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

Définissez le texte sur TextView de deux chaînes de couleurs différentes:

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

Terminé

28
Hiren Patel

Utiliser 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
Biswajit Karmakar

Hé les gars, j'ai fait ça, essayez-le  

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

Dans votre classe TextViewUtils, ajoutez cette méthode

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

J'ai écrit du code pour une autre question qui est similaire à celle-ci, mais cette question a été dupliquée, je ne peux donc pas y répondre, alors je mets simplement mon code ici si quelqu'un recherche les mêmes exigences.

Ce n'est pas un code totalement fonctionnel, vous devez apporter quelques modifications mineures pour le faire fonctionner.

Voici le code:

J'ai utilisé l'idée de @Graeme d'utiliser du texte pouvant être soumis à une partition.

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éthode de couleur aléatoire:

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

Utilisez la classe SpannableBuilder au lieu du formatage HTML, car cela est plus rapide car plus rapide que l'analyse du format HTML . Voir mon propre repère "SpannableBuilder vs HTML" sur Github Merci!

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 
 }

pour 24 API et plus (drapeau)

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;

Plus d'informations

1
Ahmad Aghazadeh

Essaye ça:

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

Réponses géniales! J'ai pu utiliser Spannable pour créer du texte coloré dans Rainbow (afin que cela puisse être répété pour n'importe quel tableau de couleurs). Voici ma méthode, si cela aide quelqu'un:

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

Et puis je viens de setText (buildRainboxText (nom_pack));; Notez que tous les mots que je passe sont sous 15 caractères et cela ne fait que répéter 5 couleurs 3 fois - vous voudriez ajuster les couleurs/longueur du tableau pour votre utilisation!

0
Casey Murray

Depuis l’API 24, vous disposez de FROM_HTML_OPTION_USE_CSS_COLORS pour pouvoir définir des couleurs en CSS au lieu de le répéter constamment avec font color=" Beaucoup plus clair - lorsque vous avez du code HTML et que vous souhaitez mettre en surbrillance certaines balises prédéfinies - vous devez simplement ajouter un fragment CSS à top de votre html

0
Filipkowicz

Il est préférable d'utiliser la chaîne dans le fichier de chaînes, en tant que telle:

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

Usage:

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