在 kotlin 中,您可以在资源上创建扩展函数(actives| 片段 | context) ,将字符串转换为 html span
例如:。
fun Resources.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()
fun Resources.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()
fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = getQuantityString(id, quantity).toHtmlSpan()
fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = getQuantityString(id, quantity, *formatArgs).toHtmlSpan()
fun String.toHtmlSpan(): Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(this)
}
用法
//your strings.xml
<string name="greeting"><![CDATA[<b>Hello %s!</b><br>]]>This is newline</string>
//in your fragment or activity
resources.getHtmlSpannedString(R.string.greeting, "World")
<string name="welcome">Welcome to <b>Android</b>!</string>
这里你将用 <代替 b 前面的 <
像这样:
<string name="welcome">Welcome to <b>Android</b>!</string>
在 kotlin 代码中,您将创建一个扩展来解析来自 html 的字符串:
fun String.fromHtml(): Spanned {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// FROM_HTML_MODE_LEGACY is the behaviour that was used for versions below android N
// we are using this flag to give a consistent behaviour
Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(this)
}
}
<string name="dialog_upgrade_item_fx_output_text">
"[B]Unlimited support for up to 5 audio effects per audio track[/B]\n
- Multiple high quality effects available Reverb, Delay, Distortion, Compressor, Equalizer\n
- Each comes with various presets or create your own"
</string>
fun Context.formatted(resId: Int): Spanned =
Html.fromHtml(getString(resId).replace("\n", "<br>")
.replace("[B]", "<b>").replace("[/B]", "</b>"), 0)
textView(R.id.dialog_upgrade_item_text)
.text(formatted(R.string.dialog_upgrade_item_fx_output_text))