使用 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
<font color="#FFFFFF"> %1$s</font>
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)
我正在使用以下内容来显示文字游戏应用程序中的剩余时间。
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
<font color="#FFFFFF"> %1$s</font>
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)