2011-02-04 2 views
76

Я ищу, чтобы изменить текст вида TextView с помощью метода .setText (""), также окрашивая часть текста (или делая его жирным, курсивным, прозрачным и т. Д.), А не остальное. Например:Android: Окрашивание части строки с помощью TextView.setText()?

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

Я знаю, что приведенный выше код неверен, но он помогает проиллюстрировать то, что я хотел бы достичь. Как мне это сделать?

+0

возможный дубликат [Как я могу изменить цвет часть TextView?] (Http://stackoverflow.com/questions/4032676/ how-can-i-change-color-part-of-a-textview) –

+0

Если в TextView имеется длинный текст, есть [более эффективный способ] (http://stackoverflow.com/a/34449956/ 3414180) – Mingfei

+0

Возможный дубликат [Set цвет области TextView в Android] (http://stackoverflow.com/questions/3282940/set-color-of-textview-span-in-android) – Suragch

ответ

177

spans.

Пример:

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

Мне действительно не нравится решение android предлагает здесь, так как оно не работает с несколькими языками, поскольку я не знаю, сколько символов в моих словах. В настоящее время я ищу решение, в котором у меня может быть несколько интервалов, которые я могу прикрепить к TextView и то они собраны вместе – philipp

+1

Комментарий, говорящий span, чтобы сделать текст полужирным, должен ли он сказать, чтобы сделать цвет текста? – Ryan

+8

@philipp, если ваша проблема в том, сколько символов в вашем слове, используйте метод length() на String или StringBuilder или независимо от того, –

4

Если вы хотите использовать HTML, вы должны использовать TextView.setText(Html.fromHtml(String htmlString))

Если вы хотите сделать что часто/несколько раз, вы можете посмотреть на класс (SpannableBuilder) я писал, а Html.fromHtml() не очень эффективно (он использует большой синтаксический анализатор xml внутри). Это описано в этом blog posting.

45
title.setText(Html.fromHtml("Your big island <b>ADVENTURE!</b>")); 
+2

Это гораздо более приятное решение исходной проблемы, чем отмеченный ответ , – BSnapZ

+1

Если у вас есть разрывы строк \ n, это не отображает разрывы строк. –

+6

Нет, это некрасиво, нет никакой функции раскраски, упомянутой в вопросе, но метод SLOW изHTML() –

7

Вы можете использовать Spannable, чтобы дать определенные части текста определенным аспектам. Я могу найти пример, если вы хотите.

Ах, прямо здесь, на 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); 
22

Я надеюсь, что это помогает (он работает с многоязычным).

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

А на код Java, вы можете сделать:

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

Таким образом, только часть "Test" будет окрашен (и выделены жирным шрифтом).

+3

Лучший ответ. Это отлично работает для интернационализированных строк. Также имеет то преимущество, что вы можете иметь цветной текст в середине вашего ресурса строки. –

+0

Для получения дополнительных пояснений см. Раздел ** Стилизация с разметкой HTML ** [здесь] (http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling). – Elisa

16

Вот пример, который будет искать все вхождения слова (регистр неважен), и цвет их красный цвет:

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

Мне нравится ваше имя: P Могу ли я изменить фон определенного слова на новый BackgroundColorSpan (Color.parseColor («# BFFFC6»))? –

1

Вы можете объединить два или более пролетами. Этот способ легче раскрасить динамический текст с использованием значения длины.

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

Используйте этот код его полезным

TextView txtTest = (TextView) findViewById(R.id.txtTest); 
txtTest.setText(Html.fromHtml("This is <font color="#ff4343">Red</font> Color!")); 
1

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

или использовать этот код:

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

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

Использование

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

textView.setText(spannable); 

enter image description here

Смежные вопросы