Android: colorer une partie d'une chaîne de caractères en utilisant TextView.setText ()?

je cherche à changer le texte d'une vue TextView via le .la méthode setText ("") en coloriant également une partie du texte (ou en le rendant gras, italique, transparent, etc.)et pas le reste. Par exemple:

title.setText("Your big island <b>ADVENTURE!</b>";

je sais que le code ci-dessus est incorrect, mais il aide à illustrer ce que je voudrais accomplir. Comment puis-je faire?

79
demandé sur Mark 2011-02-04 14:13:06

12 réponses

Utiliser couvre .

exemple:

final SpannableStringBuilder sb = new SpannableStringBuilder("your text here");

// Span to set text color to some RGB value
final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(158, 158, 158)); 

// Span to make text bold
final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); 

// Set the text color for first 4 characters
sb.setSpan(fcs, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

// make them also bold
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

yourTextView.setText(sb);
183
répondu Alex Orlov 2015-03-09 23:15:11
title.setText(Html.fromHtml("Your big island <b>ADVENTURE!</b>")); 
45
répondu sat 2011-02-04 13:28:02

j'espère que cela vous aidera (cela fonctionne avec plusieurs langues).

<string name="test_string" ><![CDATA[<font color="%1$s"><b>Test/b></font>]]> String</string>

et sur votre code java, vous pouvez faire:

int color = context.getResources().getColor(android.R.color.holo_blue_light);
String string = context.getString(R.string.test_string, color);
textView.setText(Html.fromHtml(string));

de cette façon, seule la partie" Test " sera colorée (et en gras).

24
répondu Luis 2014-09-18 12:49:37

voici un exemple qui va chercher toutes les occurrences d'un mot (insensible à la casse), et les colorier en rouge:

String notes = "aaa AAA xAaax abc aaA xxx";
SpannableStringBuilder sb = new SpannableStringBuilder(notes);
Pattern p = Pattern.compile("aaa", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(notes);
while (m.find()){
    //String word = m.group();
    //String word1 = notes.substring(m.start(), m.end());

    sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
editText.setText(sb);
16
répondu live-love 2014-10-31 17:29:51

Vous pouvez utiliser un Spannable à donner à certaines parties d'un texte certains aspects. Je peux chercher un exemple si vous voulez.

Ah, à partir de droite sur stackoverflow .

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);
8
répondu Nanne 2017-05-23 11:54:50

si vous voulez utiliser HTML, vous devez utiliser TextView.setText(Html.fromHtml(String htmlString))

si vous voulez faire cela souvent / plusieurs fois, vous pouvez avoir un regard sur une classe ( SpannableBuilder ) j'ai écrit, comme Html.fromHtml() n'est pas très efficace (il utilise une grande machine d'analyse xml à l'intérieur). Il est décrit dans ce blogue .

4
répondu Heiko Rupp 2011-02-04 11:16:02

            String str1 = "If I forget my promise to ";
            String penalty = "Eat breakfast every morning,";
            String str2 = " then I ";
            String promise = "lose my favorite toy";
           

            String strb = "<u><b><font color='#081137'>"+ penalty +",</font></b></u>";
            String strc = "<u><b><font color='#081137'>"+ promise + "</font></b></u>";
            String strd = str1 +strb+ str2 + strc;
           tv_notification.setText(Html.fromHtml(strd));

ou utilisez ce code:

    SpannableStringBuilder builder = new SpannableStringBuilder();
            SpannableString text1 = new SpannableString(str1);
            text1.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.silver)), 0, str1.length() - 1, 0);
            builder.append(text1);

            SpannableString text2 = new SpannableString(penalty);
            text2.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.midnight)), 0, penalty.length(), 0);
            text2.setSpan(new UnderlineSpan(), 0, penalty.length(), 0);
            builder.append(text2);

            SpannableString text3 = new SpannableString(str2);
            text3.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.silver)),0, str2.length(), 0);
            builder.append(text3);


            SpannableString text4 = new SpannableString(promise);
            text4.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.midnight)), 0, promise.length(), 0);
            text4.setSpan(new UnderlineSpan(),0, promise.length(), 0);
            builder.append(text4);

          tv_notification.setText(builder);
2
répondu Nur Gazi 2017-07-29 07:54:51

j'aime utiliser SpannableStringBuilder en ajoutant les différentes portées une par une, plutôt que d'appeler setSpan en calculant les longueurs de chaîne

as: (code Kotlin)

val amountSpannableString = SpannableString("₹$amount").apply {
  // text color
  setSpan(ForegroundColorSpan("#FD0025".parseColor()), 0, length, 0)
  // text size
  setSpan(AbsoluteSizeSpan(AMOUNT_SIZE_IN_SP.spToPx(context)), 0, length, 0)
  // font medium
  setSpan(TypefaceSpan(context.getString(R.string.font_roboto_medium)), 0, length, 0)
}

val spannable: Spannable = SpannableStringBuilder().apply {
  // append the different spans one by one
  // rather than calling setSpan by calculating the string lengths
  append(TEXT_BEFORE_AMOUNT)
  append(amountSpannableString)
  append(TEXT_AFTER_AMOUNT)
}

Result

2
répondu vedant 2018-06-06 07:27:35

vous pouvez concaténer deux travées ou plus. Cette façon est plus facile de colorer le texte dynamique en utilisant la valeur de longueur.

SpannableStringBuilder span1 = new SpannableStringBuilder("Android");
ForegroundColorSpan color1=new ForegroundColorSpan(getResources().getColor(R.color.colorPrimary));
span1.setSpan(color1, 0, span1.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

SpannableStringBuilder span2 = new SpannableStringBuilder("Love");
ForegroundColorSpan color2=new ForegroundColorSpan(getResources().getColor(R.color.colorSecondary));
span2.setSpan(color2, 0, span2.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

Spanned concatenated=(Spanned) TextUtils.concat(span1," => ",span2);

SpannableStringBuilder result = new SpannableStringBuilder(concatenated);

TextView tv = (TextView) rootView.findViewById(R.id.my_texview);
tv.setText(result, TextView.BufferType.SPANNABLE);
1
répondu Jorge Palacio 2016-06-26 22:49:10

utilisez ce code Son utile

TextView txtTest = (TextView) findViewById(R.id.txtTest);
txtTest.setText(Html.fromHtml("This is <font color="#ff4343">Red</font> Color!"));
1
répondu Hadi Note 2017-07-10 08:38:41
public static void setColorForPath(Spannable spannable, String[] paths, int color) {
    for (int i = 0; i < paths.length; i++) {
        int indexOfPath = spannable.toString().indexOf(paths[i]);
        if (indexOfPath == -1) {
            return;
        }
        spannable.setSpan(new ForegroundColorSpan(color), indexOfPath,
                indexOfPath + paths[i].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}

utilisant

Spannable spannable = new SpannableString("Your big island ADVENTURE");
Utils.setColorForPath(spannable, new String[] { "big", "ADVENTURE" }, Color.BLUE);

textView.setText(spannable);

enter image description here

1
répondu Phan Van Linh 2017-11-16 09:51:24

si vous utilisez Kotlin vous pouvez faire ce qui suit en utilisant le android-ktx library

val title = SpannableStringBuilder()
        .append("Your big island ")
        .bold { append("ADVENTURE") } 

title.text = s 

le bold est une fonction d'extension de SpannableStringBuilder . Vous pouvez voir la documentation ici pour une liste des opérations que vous pouvez utiliser.

un autre exemple:

val ssb = SpannableStringBuilder()
            .color(green, { append("Green text ") })
            .append("Normal text ")
            .scale(0.5, { append("Text at half size " })
            .backgroundColor(green, { append("Background green") })

green est une couleur RVB résolue.

il est même possible d'emboîter les travées de sorte que vous finissez avec quelque chose comme un DSL intégré:

bold { underline { italic { append("Bold and underlined") } } }

vous aurez besoin de ce qui suit dans votre niveau de module app build.gradle pour que cela fonctionne:

repositories {
    google()
}

dependencies {
    implementation 'androidx.core:core-ktx:0.3'
}
1
répondu David Rawson 2018-05-08 20:44:23