Изменить цвет текста одного слова в TextView - PullRequest
81 голосов
/ 28 августа 2011

Я ищу способ изменить цвет текста отдельного слова в TextView из Activity.

Например, с помощью:

String first = "This word is ";
String next = "red"
TextView t = (TextView) findViewById(R.id.textbox);
t.setText(first + next);

Как бы я изменил цвет текста next на красный?

Ответы [ 6 ]

156 голосов
/ 28 августа 2011

Самый простой способ, которым я знаю, это просто использовать html.

String first = "This word is ";
String next = "<font color='#EE0000'>red</font>";
t.setText(Html.fromHtml(first + next));

Но для этого потребуется перестроить TextView, когда (если?) Вы захотите изменить цвет, что может вызвать затруднения.

70 голосов
/ 28 августа 2011
t.setText(first + next, BufferType.SPANNABLE);
Spannable s = (Spannable)t.getText();
int start = first.length();
int end = start + next.length();
s.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

вы должны использовать spannable, это также позволит вам увеличить размер текста, сделать его жирным и т. Д. .... даже вставить изображение.

26 голосов
/ 30 августа 2016

Используйте 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);
2 голосов
/ 07 мая 2016

Если вы хотите изменить состояние всех экземпляров определенного String внутри текста TextView (без учета регистра), вы можете использовать StringBuilder s и SpannableString следующим образом:

StringBuilder textBuilder = new StringBuilder(myTextView.getText().toString());
StringBuilder searchedTextBuilder = new StringBuilder((mySearchedString));
SpannableString spannableString = new SpannableString(myTextView.getText().toString());

int counter = 0;
int index = 0;

for (int i = 0;i < textBuilder.length() - mySearchedString.length() - 1;i++)
{
    counter = 0;
    if (Character.toLowerCase(textBuilder.charAt(i)) == Character.toLowerCase(searchedTextBuilder.charAt(index)))
    {
        counter++;
        index++;
        for (int j = 1,z = i + 1;j < mySearchedString.length() - 1;j++,z++)
        {
            if (Character.toLowerCase(textBuilder .charAt(z)) == Character.toLowerCase(searchedTextBuilder .charAt(index)))
            {
                counter++;
                index++;
            }
            else
            {
                index++;
                if (index % mySearchedString.length() == 0)
                {
                    index = 0;
                }
                break;
             }
        }
        if (counter == mySearchedString.length() - 1) // A match
        {
            spannableString.setSpan(new ForegroundColorSpan(Color.RED), i,
                                i + mySearchedString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Do the change you want(In this case changing the fore ground color to red)
            index = 0;
            continue;
        }
        else
        {
            index = 0;
            continue;
        }
    }
}
myTextView.setText(spannableString);

}

  • Сохранить весь текст TextView внутри StringBuilder.
  • Сохранить искомую строку внутри StringBuilder.
  • Сохранитьwholre TextView текст внутри SpannableString
  • Выполните простую операцию, чтобы найти все String экземпляры внутри текста TextView и изменить их при достижении.
  • Установить текстовое значениеот TextView до SpannableString.
1 голос
/ 12 июля 2018

Я реализовал служебную функцию в Kotlin для собственного сценария использования и, возможно, полезен для кого-то еще.

fun getCusomTextWithSpecificTextWithDiffColor(textToBold: String, fullText: String,
                                                  targetColor: Int) =
            SpannableStringBuilder(fullText).apply {
                setSpan(ForegroundColorSpan(targetColor),
                        fullText.indexOf(textToBold),
                        (fullText.indexOf(textToBold) + textToBold.length),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }

Как я это использую:

context?.let {
        infoMessage.text = AppUtils.getCusomTextWithSpecificTextWithDiffColor(
                wordAsBold,
                completeSentence, ContextCompat.getColor(it, R.color.white))
    }
1 голос
/ 30 марта 2018

для длинной строки вы можете использовать это:

String help = getString(R.string.help);
help = help.replace("some word", "<font color='#EE0000'>some word</font>");
txtDesc.setText(Html.fromHtml(help));
...