Не забудьте выйти из пользовательского ввода используя Html.escapeHtml(str).
kelunik
1
Добавлено на уровне API 1
2red13
3
Просто предупреждение. У меня была проблема, когда мне нужно, чтобы мой текст был в верхнем регистре. Я использовал android: textAllCaps = "true" в XML и в то же время мой HTML-контент был в верхнем регистре. Это не сработало. Я удалил атрибут XML, и теперь он работает нормально. Будьте осторожны, потому что если вы используете setAllCaps () в коде, появится та же проблема.
отлично, спасибо, тоже можно сделать BackgroundColorSpan. в вашем примере есть небольшая опечатка, WordToSpan и WordtoSpan, обратите внимание на случай с To
Не работает для меня получение `java.lang.StringIndexOutOfBoundsException: length = 3; index = 12`
Мухаммед Бабар
1
StringIndexOutOfBoundsException сама по себе пояснительная. Вы получаете доступ к строке за ее пределами.
Свопнил Котвал
1
Мои строки не были исправлены, поэтому строки будут генерироваться во время выполнения приложения. Я перепробовал почти все ответы на этот вопрос. Но только это решение работало для меня.
Г-жа Саббир Ахмед
33
Вы можете использовать Spannableдля применения эффектов к TextView:
Вот мой пример раскраски только первой части TextViewтекста (при этом вы можете установить цвет динамически, а не жестко кодировать его в строку, как в примере с HTML!)
mTextView.setText("Red text is here",BufferType.SPANNABLE);Spannable span =(Spannable) mTextView.getText();
span.setSpan(newForegroundColorSpan(0xFFFF0000),0,"Red".length(),Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
В этом примере вы можете заменить 0xFFFF0000 на getResources().getColor(R.color.red)
TextView textView=(TextView)findViewById(R.id.yourTextView);//init//here I am appending two string into my textView with two diff colors.//I have done from fragment so I used here getActivity(), //If you are trying it from Activity then pass className.this or this;
textView.append(TextViewUtils.getColoredString(getString(R.string.preString),ContextCompat.getColor(getActivity(),R.color.firstColor)));
textView.append(TextViewUtils.getColoredString(getString(R.string.postString),ContextCompat.getColor(getActivity(),R.color.secondColor)));
Внутри вашего класса TextViewUtils добавьте этот метод
/***
*
* @param mString this will setup to your textView
* @param colorId text will fill with this color.
* @return string with color, it will append to textView.
*/publicstaticSpannable getColoredString(String mString,int colorId){Spannable spannable =newSpannableString(mString);
spannable.setSpan(newForegroundColorSpan(colorId),0, spannable.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);Log.d(TAG,spannable.toString());return spannable;}
Я записал некоторый код для другого вопроса, который похож на этот, но этот вопрос дублировался, поэтому я не могу ответить на него, поэтому я просто размещаю свой код здесь, если кто-то ищет такое же требование.
Это не полностью рабочий код, вам нужно внести небольшие изменения, чтобы он заработал.
Вот код:
Я использовал @Graeme идею использования связующего текста.
String colorfulText ="colorfulText";Spannable span =newSpannableString(colorfulText);for(int i =0, len = colorfulText.length(); i < len; i++){
span.setSpan(newForegroundColorSpan(getRandomColor()), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}((TextView)findViewById(R.id.txtSplashscreenCopywrite)).setText(span);
Используйте класс SpannableBuilder вместо форматирования HTML, где это возможно, потому что это быстрее, чем анализ формата HTML. Смотрите мой собственный тест "SpannableBuilder vs HTML" на Github.
Спасибо!
Потрясающие ответы! Я смог использовать Spannable для создания текста цвета радуги (так что это можно повторить для любого массива цветов). Вот мой метод, если он кому-нибудь поможет:
privateSpannable buildRainbowText(String pack_name){int[] colors =newint[]{Color.RED,0xFFFF9933,Color.YELLOW,Color.GREEN,Color.BLUE,Color.RED,0xFFFF9933,Color.YELLOW,Color.GREEN,Color.BLUE,Color.RED,0xFFFF9933,Color.YELLOW,Color.GREEN,Color.BLUE,Color.RED,0xFFFF9933,Color.YELLOW,Color.GREEN,Color.BLUE};Spannable word =newSpannableString(pack_name);for(int i =0; i < word.length(); i++){
word.setSpan(newForegroundColorSpan(colors[i]), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}return word;}
И тогда я просто setText (buildRainboxText (pack_name)); Обратите внимание, что все слова, которые я передаю, имеют длину до 15 символов, и это просто повторяет 5 цветов 3 раза - вы хотите настроить цвета / длину массива для своего использования!
Начиная с API 24 у вас есть FROM_HTML_OPTION_USE_CSS_COLORS, так что вы можете определять цвета в CSS вместо того, чтобы повторять это все время с font color="
гораздо более понятным - когда у вас есть немного HTML и вы хотите выделить некоторые предопределенные теги - вам просто нужно добавить фрагмент CSS в верхней части вашего HTML
Ответы:
да, если вы отформатируете свойство
String
withhtml
,font-color
то передадите его методуHtml.fromHtml(your text here)
источник
Html.escapeHtml(str)
.Html.fromHtml(String)
теперь устарела, вместо использованияHtml.fromHtml(String, Html.FROM_HTML_MODE_LEGACY)
. Более подробную информацию можно найти здесь.Вы можете печатать строки с несколькими цветами без HTML как:
источник
Вы можете использовать
Spannable
для применения эффектов кTextView
:Вот мой пример раскраски только первой части
TextView
текста (при этом вы можете установить цвет динамически, а не жестко кодировать его в строку, как в примере с HTML!)В этом примере вы можете заменить 0xFFFF0000 на
getResources().getColor(R.color.red)
источник
Я сделал так:
Установите цвет для текста , передав строку и цвет :
Установите текст в TextView / Button / EditText и т. Д., Вызвав код ниже:
TextView:
Получить цветную строку:
Установите Text для TextView двух строк с разными цветами:
Готово
источник
Html.fromHtml("...")
звонкиHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
Использовать SpannableStringBuilder
источник
Эй, ребята, я сделал это, попробуйте
Внутри вашего класса TextViewUtils добавьте этот метод
источник
Лучше использовать строку в файле строк, как таковую:
Использование:
источник
Я записал некоторый код для другого вопроса, который похож на этот, но этот вопрос дублировался, поэтому я не могу ответить на него, поэтому я просто размещаю свой код здесь, если кто-то ищет такое же требование.
Это не полностью рабочий код, вам нужно внести небольшие изменения, чтобы он заработал.
Вот код:
Я использовал @Graeme идею использования связующего текста.
Метод случайного цвета:
источник
Попробуй это:
источник
Используйте класс SpannableBuilder вместо форматирования HTML, где это возможно, потому что это быстрее, чем анализ формата HTML. Смотрите мой собственный тест "SpannableBuilder vs HTML" на Github. Спасибо!
источник
Потрясающие ответы! Я смог использовать Spannable для создания текста цвета радуги (так что это можно повторить для любого массива цветов). Вот мой метод, если он кому-нибудь поможет:
И тогда я просто setText (buildRainboxText (pack_name)); Обратите внимание, что все слова, которые я передаю, имеют длину до 15 символов, и это просто повторяет 5 цветов 3 раза - вы хотите настроить цвета / длину массива для своего использования!
источник
для 24 API и более (флаг)
Больше информации
источник
Начиная с API 24 у вас есть FROM_HTML_OPTION_USE_CSS_COLORS, так что вы можете определять цвета в CSS вместо того, чтобы повторять это все время с
font color="
гораздо более понятным - когда у вас есть немного HTML и вы хотите выделить некоторые предопределенные теги - вам просто нужно добавить фрагмент CSS в верхней части вашего HTMLисточник
25 июня 2020 года @canerkaseler
После вызова вышеуказанной функции. Вы можете позвонить более чем одному:
Вывод: Вы можете видеть подчеркивание и разные цвета друг с другом.
@canerkaseler
источник