87

我正在开发一个应用程序,其中将有一个搜索屏幕,用户可以在其中搜索特定关键字,并且应该突出显示该关键字。我找到了 Html.fromHtml 方法。

但我想知道它是否是正确的做法。

请让我知道您对此的看法。

4

10 回答 10

209

或者比手动处理Spannables 简单得多,因为您没有说要突出显示背景,只是文本:

String styledText = "This is <font color='red'>simple</font>.";
textView.setText(Html.fromHtml(styledText), TextView.BufferType.SPANNABLE);
于 2010-05-30T10:14:01.410 回答
39

使用来自 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); 
于 2013-02-20T18:04:06.597 回答
13

这可以使用 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 处的字符。希望这可以帮助!

于 2010-04-28T17:19:08.450 回答
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
    }
于 2017-05-23T11:08:18.353 回答
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");
于 2010-04-28T17:48:00.733 回答
2

不推荐使用字体,而是使用 spanHtml.fromHtml("<span style=color:red>"+content+"</span>")

于 2017-04-24T15:28:49.607 回答
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());
于 2018-10-05T20:46:57.943 回答
0
textview.setText(Html.fromHtml("<font color='rgb'>"+text contain+"</font>"));

它将给出您在 html 编辑器中所做的颜色,只需设置 textview 并将其与 textview 值连接即可。Android 不支持跨度颜色,在编辑器中将其更改为字体颜色即可。

于 2016-02-19T07:51:10.410 回答
0

首先将您的字符串转换为 HTML,然后将其转换为 spannable。按照以下代码的建议进行操作。

 Spannable spannable = new SpannableString(Html.fromHtml(labelText));
                    
spannable.setSpan(new ForegroundColorSpan(Color.parseColor(color)), spannable.toString().indexOf("•&quot;), spannable.toString().lastIndexOf("•&quot;) + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            
于 2020-03-06T07:39:13.450 回答
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 扩展(删除 alpha):

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

演示

演示

于 2020-12-15T23:06:07.260 回答