我不知道如何使TextView上的特定文本变成粗体。

是这样的

txtResult.setText(id+" "+name);

我希望输出是这样的:

1111年尼尔

id和名称是我从数据库中检索值的变量,我想将id改为粗体,但只有id,所以名称不会受到影响,我不知道如何做到这一点。


当前回答

如果你正在使用Kotlin和string资源,一个简单的解决方案是:

在strings.xml上创建你的字符串,使用<b> </b>加粗你想要的部分

<string name="my_message"> This is a very <b>important</b> message! </string>

在Kotlin代码中,你必须这样做

textView.setText(R.string.my_message)

就是这样!


重要提示!

使用属性语法将不起作用:

textView.text = resources.getString(R.string.my_message)

希望能有所帮助!

其他回答

wtsang02答案是最好的方法,因为,Html.fromHtml("")现在已弃用。这里我要稍微加强一下,以方便那些在动态地将第一个单词加粗方面有问题的人,不管句子的大小。

首先让我们创建一个方法来获取第一个单词:

 private String getFirstWord(String input){

    for(int i = 0; i < input.length(); i++){

        if(input.charAt(i) == ' '){

            return input.substring(0, i);
        }
    }

    return input;
}

现在假设你有一个像这样的长字符串:

String sentence = "friendsAwesomeName@gmail.com want's to be your friend!"

你希望你的句子是yourAwesomeName@gmail.com想成为你的朋友! 你所要做的就是-获取firstWord并获取它的长度以使firstWord加粗,就像这样:

String myFirstWord = getFirstWord(sentence);
int start = 0; // bold will start at index 0
int end = myFirstWord.length(); // and will finish at whatever the length of your first word

现在按照wtsang02的步骤来做,就像这样:

SpannableStringBuilder fancySentence = new SpannableStringBuilder(sentence);
fancySentence.setSpan(new android.text.style.StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(fancySentence);

就是这样!现在你应该可以在长句或短句中加粗任意大小的单词了。

如果粗体文本的位置是固定的(例如:如果是在textView的开始),然后使用两个不同的textView具有相同的背景。然后你可以使其他textView的textStyle为粗体。

与单个textView相比,这将需要两倍的内存,但速度会提高。

这是我的完整的解决方案,动态字符串值与大小写检查。

/**
 * Makes a portion of String formatted in BOLD.
 *
 * @param completeString       String from which a portion needs to be extracted and formatted.<br> eg. I am BOLD.
 * @param targetStringToFormat Target String value to format. <br>eg. BOLD
 * @param matchCase Match by target character case or not. If true, BOLD != bold
 * @return A string with a portion formatted in BOLD. <br> I am <b>BOLD</b>.
 */
public static SpannableStringBuilder formatAStringPortionInBold(String completeString, String targetStringToFormat, boolean matchCase) {
    //Null complete string return empty
    if (TextUtils.isEmpty(completeString)) {
        return new SpannableStringBuilder("");
    }

    SpannableStringBuilder str = new SpannableStringBuilder(completeString);
    int start_index = 0;

    //if matchCase is true, match exact string
    if (matchCase) {
        if (TextUtils.isEmpty(targetStringToFormat) || !completeString.contains(targetStringToFormat)) {
            return str;
        }

        start_index = str.toString().indexOf(targetStringToFormat);
    } else {
        //else find in lower cases
        if (TextUtils.isEmpty(targetStringToFormat) || !completeString.toLowerCase().contains(targetStringToFormat.toLowerCase())) {
            return str;
        }

        start_index = str.toString().toLowerCase().indexOf(targetStringToFormat.toLowerCase());
    }

    int end_index = start_index + targetStringToFormat.length();
    str.setSpan(new StyleSpan(BOLD), start_index, end_index, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return str;
}

如。completeString = "I am BOLD"

情况下,我 if *targetStringToFormat* = "bold" and *matchCase* = true

返回“I am BOLD”(因为BOLD != BOLD)

案例二世 if *targetStringToFormat* = "bold" and *matchCase* = false

返回“I am BOLD”

应用:

myTextView.setText(formatAStringPortionInBold("I am BOLD", "bold", false))

希望有帮助!

根据@mladj0ni的回答,我得到了下面的代码。问题是如果你使用String。格式,它剥离了HTML标记,所以你必须转义strings.xml中的括号符号:

strings.xml:

<string name="welcome_messages">Hello, %1$s!你有&lt;b>%2$d新消息&lt;/b>.</string> .</string> .

code.java:

String unspanned = String.format(Locale.US, "%s%s", getResources().getString(R.string. welcome_messages), 99);

Spanned spanned;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    spanned = Html.fromHtml(unspanned, Html.FROM_HTML_MODE_LEGACY);
} else {
    spanned = Html.fromHtml(unspanned);
}

textView.setText(spanned);

它比SpannableStringBuilder简单。至于性能,如果只显示一个字符串,那么用户不会注意到解析它所花费的额外毫秒。

请在这里查看文档。

以防有人使用数据绑定。我们可以像这样定义绑定适配器

@BindingAdapter("html")
fun setHtml(view: TextView, html: String) {
    view.setText(HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY))
}

然后我们可以在TextView上使用它

app:html="@{@string/bold_text}"

bold_text在哪里

<string name="bold_text"><![CDATA[Part of text is <b>bold</b>]]></string>