使用 String.format() 时更改字符串两部分的颜色

Change color of two parts of string when using String.format()

我正在使用以下内容来显示文字游戏应用程序中的剩余时间。

remainingTime.setText(String.format(Locale.getDefault(),"REMAINING TIME: %d MNS %d SECONDS ",(millisUntilFinished / 1000) / 60 ,(millisUntilFinished / 1000) % 60));

我想更改分秒文本的颜色。如何在占位符中定义颜色?

我希望它看起来像这样:

如果您使用的是 Kotlin,则可以使用扩展函数来实现。

    fun TextView.setColouredSpan(word: String, color: Int) {
        val spannableString = SpannableString(text)
        val start = text.indexOf(word)
        val end = text.indexOf(word) + word.length
        try {
            spannableString.setSpan(ForegroundColorSpan(color), start, end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            text = spannableString
        } catch (e: IndexOutOfBoundsException) {
         println("'$word' was not not found in TextView text")
    }
}

像这样将文本设置到 TextView 后使用它

private val blueberry by lazy { getColor(R.color.blueberry) }

textViewTip.setColouredSpan("Warning", blueberry)

我做到了。我所做的是使用正则表达式找到数字并使用 可在 matches.find() 的 while 循环中对匹配项的索引着色。开始是索引,结束索引 + 2。

您可以使用以下方法获取不同颜色的数字

public SpannableString getColoredString(String string, int color){

        SpannableString spannableString = new SpannableString(string);

        for(int i = 0; i < string.length(); i++){
            if(Character.isDigit(string.charAt(i))){
                spannableString.setSpan(new ForegroundColorSpan(color), i, i+1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            }
        }
        return spannableString;
    }

在您的 Activity 代码中使用上述函数并将 return 值设置为文本视图

String text = String.format(Locale.getDefault(),"REMAINING TIME: %d MNS %d SECONDS ",(millisUntilFinished / 1000) / 60 ,(millisUntilFinished / 1000) % 60);

SpannableString string = getColoredString(text, Color.YELLOW);

remainingTime.setText(string);

在我的例子中,我有一些“一些文本电子邮件@test.com一些文本”。 其中 email@test.com 必须使用不同的颜色。

我试过了:

<string name="myText">
some text
<font color="#FFFFFF">%1$s</font>
some text
</string>

但是在 getString 之后,HtmlCompat 似乎忽略了“字体颜色”,所以这就是为什么我像往常一样使用符号“<”和“>”的原因:

<string name="myText">
some text
&lt;font color="#FFFFFF"&gt; %1$s&lt;/font&gt;
some text
</string>

在那之后,一切都如我所愿地出现了:

val email = "email@test.com"
val text = getString(R.string.myText, email)

binding.textView.text = HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_LEGACY)