Установить цвет диапазона TextView в Android - PullRequest
178 голосов
/ 19 июля 2010

Можно ли установить цвет всего текста в TextView?

Я хотел бы сделать что-то похожее на приложение Twitter, в котором часть текста синего цвета.Смотрите изображение ниже:

alt text

Ответы [ 12 ]

386 голосов
/ 18 августа 2010

Другой ответ был бы очень похож, но не нужно было бы устанавливать текст TextView дважды

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);
78 голосов
/ 19 мая 2011

Вот небольшая справочная функция.Отлично подходит, когда у вас несколько языков!

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);
}
27 голосов
/ 31 января 2017

Я всегда нахожу наглядные примеры, когда пытаюсь понять новую концепцию.

Цвет фона

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

Передний планЦвет

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

Комбинация

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

Дальнейшее изучение

27 голосов
/ 28 февраля 2014

Если вы хотите больше контроля, вы можете проверить класс TextPaint.Вот как это использовать:

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);
    }
};
18 голосов
/ 19 июля 2010

Установите текстовый * * * * * * * и укажите ForegroundColorSpan для вашего текста.

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);
12 голосов
/ 09 августа 2012

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

Если ваш Spannable будет использоваться, например, в TextViewВы можете установить цвет ссылки в XML следующим образом:

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

Вы также можете установить его в коде с помощью:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setLinkTextColor(your_color);
5 голосов
/ 16 июня 2015

Установить цвет на Текст на передавая строку и цвет :

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

Установить текст на TextView / Button / EditText и т. Д., Позвонив по следующему коду:

TextView:

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

Цветная строка:

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

Установить текст в TextView:

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

Выполнено

5 голосов
/ 13 декабря 2011

Есть фабрика для создания Spannable, и избегайте приведения, как это:

Spannable span = Spannable.Factory.getInstance().newSpannable("text");
2 голосов
/ 23 декабря 2017
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;
}

Выход:

enter image description here

1 голос
/ 27 ноября 2018

Вот функция расширения Kotlin, которая у меня есть для этого

    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")
    }
}

Используйте ее после того, как вы установили свой текст в TextView следующим образом:

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

textViewTip.setColouredSpan("Warning", blueberry)
...