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

84

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

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

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

Сунил
источник
посмотрите рабочий пример. javatechig.com/2013/04/07/how-to-display-html-in-android-view
Nilanchal

Ответы:

198

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

String styledText = "This is <font color='red'>simple</font>.";
textView.setText(Html.fromHtml(styledText), TextView.BufferType.SPANNABLE);
Кристофер Орр
источник
8
Стоит отметить, что Html.fromHtml медленнее, чем SpannableString, потому что требует синтаксического анализа. Но для короткого текста это не имеет значения
Michał K
Похоже, по ссылке есть другое решение . См. Ответ Legend.
Kenneth Evans
1
В качестве комментария я обнаружил, что мне не нужно передавать TextView.BufferType.SPANNABLE, и он все еще работал. Благодаря!
Джеймс
знаете ли вы какой-нибудь редактор HTML для создания длинного текста для Android. например, я пытаюсь использовать этот сайт ( html.am/html-editors/html-text-editor.cfm ), но если я хочу увидеть источник, он возвращает цвет, <span style="color:#ff0000;">так что Android не меняет цвет.
мехмет
@mehmet Предположительно, вы могли бы просто выполнить поиск и заменить теги <span> на теги <font> с атрибутом «цвет».
Christopher Orr
36

Использование значения цвета из ресурса 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); 
СергейА
источник
красиво сделано. полезно иметь возможность использовать цвета из ресурсов вашего приложения.
speedynomads
Я хочу подчеркнуть вторую строку, в которой вы подставляете шестнадцатеричное значение цвета: альфа делает настройку цвета недействительной! Не забывай об этом!
Marcolav
12

Это может быть достигнуто с помощью 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 будут выделены красным цветом. Надеюсь это поможет!

стелс-вертолет
источник
5
 String name = modelOrderList.get(position).getName();   //get name from List
    String text = "<font color='#000000'>" + name + "</font>"; //set Black color of name
    /* check API version, according to version call method of Html class  */
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N) {
        Log.d(TAG, "onBindViewHolder: if");
        holder.textViewName.setText(context.getString(R.string._5687982) + " ");
        holder.textViewName.append(Html.fromHtml(text));
    } else {
        Log.d(TAG, "onBindViewHolder: else");
        holder.textViewName.setText("123456" + " ");   //set text 
        holder.textViewName.append(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY));   //append text into textView
    }
Кьяти Фатания
источник
1
как получить цвет шрифта из color.xml?
Нур Хоссейн,
4

Альтернативное решение: вместо этого использовать 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");
Видар Вестнес
источник
2

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

Mhdtouban
источник
1

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

в вашем 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());
bsma
источник
0
textview.setText(Html.fromHtml("<font color='rgb'>"+text contain+"</font>"));

Он придаст цвет именно такой, какой вы сделали в редакторе HTML, просто установите текстовое представление и объедините его со значением текстового представления. Android не поддерживает цвет диапазона, измените его на цвет шрифта в редакторе, и все готово.

Наина
источник
0

Сначала преобразуйте вашу строку в 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);
            
Мухаммад Хуррам Муштак
источник
0

Добавляем также версию 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)
}

Демо

демо

Boken
источник