Выделение цвета текста с помощью Html.fromHtml() в Android?

Я разрабатываю приложение, в котором будет экран поиска, где пользователь может искать определенные ключевые слова, и это ключевое слово должно быть выделено. Я нашел метод Html.fromHtml.

Но я хотел бы знать, правильно ли это делать или нет.

Пожалуйста, дайте мне знать ваши взгляды на это.


person sunil    schedule 28.04.2010    source источник
comment
проверьте рабочий пример. javatechig.com/2013/04/07 /how-to-display-html-in-android-view   -  person Nilanchal    schedule 08.04.2013
comment
Возможный дубликат Возможно ли иметь несколько стилей внутри Текстовый вид?   -  person blahdiblah    schedule 09.10.2013


Ответы (10)


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

String styledText = "This is <font color='red'>simple</font>.";
textView.setText(Html.fromHtml(styledText), TextView.BufferType.SPANNABLE);
person Christopher Orr    schedule 30.05.2010
comment
Стоит отметить, что Html.fromHtml медленнее, чем SpannableString, потому что он включает синтаксический анализ. Но для короткого текста это не имеет значения - person Michał Klimczak; 08.12.2012
comment
Похоже, есть другое решение по ссылке. . Смотрите ответ Легенды. - person Kenneth Evans; 16.01.2013
comment
В качестве комментария я обнаружил, что мне не нужно передавать TextView.BufferType.SPANNABLE, и это все еще работает. Спасибо! - person James; 29.04.2014
comment
Знаете ли вы какой-нибудь HTML-редактор для аранжировки длинного текста для Android. например, я пытаюсь использовать этот сайт (html.am/html- editors/html-text-editor.cfm), но если я хочу увидеть исходный код, он возвращает цвет как <span style="color:#ff0000;">, чтобы андроид не менял цвет. - person mehmet; 07.06.2014
comment
@mehmet Возможно, вы могли бы просто выполнить поиск и замену, чтобы изменить теги span на теги font с атрибутом цвета. - person Christopher Orr; 10.06.2014
comment
вы спасаете мой день, и это также работает для текста подсказки. - person Anand Savjani; 23.03.2016
comment
Пояснение для тех, кто задается вопросом, как использовать определенный шестнадцатеричный цвет в html: <font color='#aabbcc'>text</font> - person Johnny Five; 19.03.2019
comment
@JohnnyFive Я пытаюсь изменить цвет текста тега. Но это не работает для меня. Он всегда устанавливает цвет для акцентного цвета приложения. любое предложение? - person Mateen Chaudhry; 23.04.2019

Использование значения цвета из ресурса xml:

int labelColor = getResources().getColor(R.color.label_color);
String сolorString = String.format("%X", labelColor).substring(2); // !!strip alpha value!!

Html.fromHtml(String.format("<font color=\"#%s\">text</font>", сolorString), TextView.BufferType.SPANNABLE); 
person SergeyA    schedule 20.02.2013
comment
хорошо сделано. полезно иметь возможность использовать цвета из ресурсов ваших приложений. - person speedynomads; 07.05.2013
comment
Я хочу подчеркнуть вторую строку, где вы подстроите шестнадцатеричное значение цвета: альфа-значение сделает настройку цвета недействительной! Не забывайте об этом! - person marcolav; 20.03.2018

Этого можно добиться с помощью Spannable String. Вам нужно будет импортировать следующее

import android.text.SpannableString; 
import android.text.style.BackgroundColorSpan; 
import android.text.style.StyleSpan;

И затем вы можете изменить фон текста, используя что-то вроде следующего:

TextView text = (TextView) findViewById(R.id.text_login);
text.setText("");
text.append("Add all your funky text in here");
Spannable sText = (Spannable) text.getText();
sText.setSpan(new BackgroundColorSpan(Color.RED), 1, 4, 0);

Где это выделит символы на позициях 1-4 красным цветом. Надеюсь это поможет!

person stealthcopter    schedule 28.04.2010

Альтернативное решение: вместо этого используйте WebView. С HTML легко работать.

WebView webview = new WebView(this);

String summary = "<html><body>Sorry, <span style=\"background: red;\">Madonna</span> gave no results</body></html>";

webview.loadData(summary, "text/html", "utf-8");
person Vidar Vestnes    schedule 28.04.2010
comment
из-за ограничений fromHTML() я стремлюсь к приложению для планшета с текстом на каждой панели, отображаемой в WebView. Добро пожаловать в 2020-е, где все представляет собой веб-страницу, включая текстовое представление вашего планшета!~ - person Phlip; 08.04.2021

шрифт устарел, используйте span вместо Html.fromHtml("<span style=color:red>"+content+"</span>")

person mhdtouban    schedule 24.04.2017

Чтобы сделать часть текста подчеркнутой и окрашенной

в вашем файле strings.xml

<string name="text_with_colored_underline">put the text here and &lt;u>&lt;font color="#your_hexa_color">the underlined colored part here&lt;font>&lt;u></string>

затем в деятельности

yourTextView.setText(Html.fromHtml(getString(R.string.text_with_colored_underline)));

и для интерактивных ссылок:

<string name="text_with_link"><![CDATA[<p>text before link<a href=\"http://www.google.com\">title of link</a>.<p>]]></string>

и в вашей деятельности:

yourTextView.setText(Html.fromHtml(getString(R.string.text_with_link)));
yourTextView.setMovementMethod(LinkMovementMethod.getInstance());
person bsma    schedule 05.10.2018

textview.setText(Html.fromHtml("<font color='rgb'>"+text contain+"</font>"));

Это даст цвет точно так же, как вы сделали в редакторе html, просто установите текстовое представление и соедините его со значением текстового представления. Android не поддерживает цвет диапазона, измените его на цвет шрифта в редакторе, и все готово.

person Naina    schedule 19.02.2016

Сначала преобразуйте строку в HTML, а затем преобразуйте ее в spannable. сделайте, как предлагают следующие коды.

 Spannable spannable = new SpannableString(Html.fromHtml(labelText));
                    
spannable.setSpan(new ForegroundColorSpan(Color.parseColor(color)), spannable.toString().indexOf("•"), spannable.toString().lastIndexOf("•") + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            
person Muhammad Khurram Mushtaq    schedule 06.03.2020

Добавление также версии Kotlin с:

  • получение текста из ресурсов (strings.xml)
  • получение цвета из ресурсов (colors.xml)
  • выборка HEX перемещена как расширение
fun getMulticolorSpanned(): Spanned {
    // Get text from resources
    val text: String = getString(R.string.your_text_from_resources)

    // Get color from resources and parse it to HEX (RGB) value
    val warningHexColor = getHexFromColors(R.color.your_error_color)

    // Use above string & color in HTML
    val html = "<string>$text<span style=\"color:#$warningHexColor;\">*</span></string>"

    // Parse HTML (base on API version)
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
    } else {
        Html.fromHtml(html)
    }
}

И расширение Kotlin (с удалением альфы):

fun Context.getHexFromColors(
    colorRes: Int
): String {
    val labelColor: Int = ContextCompat.getColor(this, colorRes)
    return String.format("%X", labelColor).substring(2)
}

Демо

демонстрация

person Boken    schedule 15.12.2020

person    schedule
comment
как получить цвет шрифта из color.xml? - person Noor Hossain; 29.09.2020
comment
int color = getResources().getColor(R.color.any_color_name); - person Khyati Fatania; 20.07.2021