web-dev-qa-db-fra.com

Définir la couleur de TextView span dans Android

Est-il possible de définir la couleur d'une étendue de texte dans un TextView?

J'aimerais faire quelque chose de similaire à l'application Twitter, dans laquelle une partie du texte est en bleu. Voir l'image ci-dessous:

alt text

166
hpique

Une autre réponse serait très similaire, mais n'aurait pas besoin de définir le texte de TextView deux fois

TextView TV = (TextView)findViewById(R.id.mytextview01);

Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");        

wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

TV.setText(wordtoSpan);
365
DanO

Voici une petite fonction d'aide. Parfait pour les langues multiples!

private void setColor(TextView view, String fulltext, String subtext, int color) {
    view.setText(fulltext, TextView.BufferType.SPANNABLE);
    Spannable str = (Spannable) view.getText();
    int i = fulltext.indexOf(subtext);
    str.setSpan(new ForegroundColorSpan(color), i, i + subtext.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
76
mach

Si vous souhaitez plus de contrôle, vous pouvez vérifier la classe TextPaint. Voici comment l'utiliser:

final ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(final View textView) {
        //Your onClick code here
    }

    @Override
    public void updateDrawState(final TextPaint textPaint) {
        textPaint.setColor(yourContext.getResources().getColor(R.color.orange));
        textPaint.setUnderlineText(true);
    }
};
25
Tiago

Je trouve toujours des exemples visuels utiles lorsque j'essaie de comprendre un nouveau concept.

Couleur de fond

 enter image description here

SpannableString spannableString = new SpannableString("Hello World!");
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(backgroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

Couleur de premier plan

 enter image description here

SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

Combinaison

 enter image description here

SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

Une étude plus approfondie

22
Suragch

Définissez le texte de votre TextView´ sur spannable et définissez une ForegroundColorSpan pour votre texte.

TextView textView = (TextView)findViewById(R.id.mytextview01);    
Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");          
wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
textView.setText(wordtoSpan);
18
Elenasys

Une autre méthode qui peut être utilisée dans certaines situations consiste à définir la couleur du lien dans les propriétés de la vue qui prend le Spannable.

Si votre Spannable doit être utilisé dans un TextView, par exemple, vous pouvez définir la couleur du lien dans le code XML comme suit:

<TextView
    Android:id="@+id/myTextView"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:textColorLink="@color/your_color"
</TextView>

Vous pouvez également le définir dans le code avec:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setLinkTextColor(your_color);
12
Dave

Il y a une usine pour créer le Spannable, et éviter le casting, comme ceci:

Spannable span = Spannable.Factory.getInstance().newSpannable("text");
5
Thomas Emil Hansen

Définir la couleur sur Texte par chaîne de passage et couleur :

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

Définir 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");

Définir le texte sur TextView:

txtView.setText(Html.fromHtml(name));

Terminé

5
Hiren Patel
String text = "I don't like Hasina.";
textView.setText(spannableString(text, 8, 14));

private SpannableString spannableString(String text, int start, int end) {
    SpannableString spannableString = new SpannableString(text);
    ColorStateList redColor = new ColorStateList(new int[][]{new int[]{}}, new int[]{0xffa10901});
    TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, redColor, null);

    spannableString.setSpan(highlightSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(new BackgroundColorSpan(0xFFFCFF48), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(new RelativeSizeSpan(1.5f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    return spannableString;
}

Sortie:

 enter image description here

2
Ahamadullah Saikat

Juste pour ajouter à la réponse acceptée, car toutes les réponses semblent parler de Android.graphics.Color seulement: que se passe-t-il si la couleur que je veux est définie dans res/values/colors.xml?

Par exemple, considérons Couleurs de conception du matériau définies dans colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="md_blue_500">#2196F3</color>
</resources>

( Android_material_design_colours.xml est votre meilleur ami)

Ensuite, utilisez ContextCompat.getColor(getContext(), R.color.md_blue_500) où vous utiliseriez Color.BLUE, de sorte que:

wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

devient:

wordtoSpan.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.md_blue_500)), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Où j'ai trouvé ça:

  1. créer du texte dans votre mise en page 
  2. collez ce code dans votre mainActivity

    TextView textview=(TextView)findViewById(R.id.textviewid);
    Spannable spannable=new SpannableString("Hello my name is sunil");
    spannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 5, 
    Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    textview.setText(spannable);
    //Note:- the 0,5 is the size of colour which u want to give the strring
    //0,5 means it give colour to starting from h and ending with space i.e.(hello), if you want to change size and colour u can easily
    
0
Sunil

Voici une fonction d'extension Kotlin que j'ai pour cela

    fun TextView.setColouredSpan(Word: String, color: Int) {
        val spannableString = SpannableString(text)
        val start = text.indexOf(Word)
        val end = text.indexOf(Word) + Word.length
        try {
            spannableString.setSpan(ForegroundColorSpan(color), start, end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            text = spannableString
        } catch (e: IndexOutOfBoundsException) {
         println("'$Word' was not not found in TextView text")
    }
}

Utilisez-le après avoir défini votre texte sur TextView

private val blueberry by lazy { getColor(R.color.blueberry) }

textViewTip.setColouredSpan("Warning", blueberry)
0
Ivan Wooll