我在strings.xml
中有一个字符串,它被本地化为不同的语言。每个本地化的字符串都使用Html标记进行样式化。
使用AndroidTextView
,我能够通过阅读字符串资源来显示样式化的文本。
考虑到Jetpack Compose目前不支持Html标签,我尝试在AndroidView
composable中使用TextView
,以下是官方声明:https://developer.android.com/jetpack/compose/interop/interop-apis#views-in-compose
我尝试的例子:
@Composable
fun StyledText(text: String, modifier: Modifier = Modifier) {
AndroidView(
modifier = modifier,
factory = { context -> TextView(context) },
update = {
it.text = HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_COMPACT)
}
)
}
strings.xml
文件中的文本:
<string name="styled_text">Sample text with <b>bold styling</b> to test</string>
但是,使用stringResource(id = R.string.styled_text)
提供的文本没有Html标记。
有没有一种方法可以在Jetpack Compose中使用Html样式显示字符串资源中的文本**?
以下两个问题类似,但它们不从资源中读取字符串:
Jetpack compose display html in text
Android Compose: How to use HTML tags in a Text view
4条答案
按热度按时间3bygqnnd1#
目前正在讨论如何在Jetpack Compose UI上实现:https://issuetracker.google.com/issues/139320238
经过一些研究,我想出了以下解决方案,我也在同一个讨论中发布:
来源:https://issuetracker.google.com/issues/139320238#comment11
使用这些辅助方法,您可以简单地调用:
rryofs0p2#
stringResource
使用resources.getString
,它会丢弃任何样式化的信息。你需要创建类似textResource
的东西来获取原始值:然后像这样使用它:
xe55xuns3#
要继续使用
stringResources()
,您可以按照下面的操作。第一-使用
<![CDATA[ … ]]>
在
<![CDATA[ … ]]>
之间包含所有资源HTML字符串,那么在调用stringResources()
时就不会丢失HTML定义:**第二步-创建 “从
Spanned
到AnnotatedString
处理器”首先感谢this awesome answer。
然后,重要的是要知道
text
参数 (来自Text()
composable) 也接受AnnotatedString
对象,而不仅仅是String
。我们可以使用Jetpack
buildAnnotatedString()
创建一个 “从Spanned
到AnnotatedString
处理器” 算法。在这种情况下,我会选择 “将算法创建为客户端可组合文件内的扩展
private
函数” 路径:第三次-调用
HtmlCompat.fromHtml()
在将
AnnotatedString
发送到Text()
组合之前的最后一步,我们需要调用目标String
onHtmlCompat.fromHtml()
方法以及新的toAnnotatedString()
扩展函数:第四-在
Text()
上显示然后将其显示在目标
Text()
组合产品上:注意:您可以在
toAnnotatedString()
内部添加很多 “样式解释器”。下面的打印 (红色矩形内的所有内容) 来自我的Android项目上的一个可组合
SnackBar
,使用了与上面相同的策略。sz81bmfz4#
目前,您可以使用
AnnotatedString
类来显示Text
组件中的样式化文本。我给你举个例子:根据您指定的样式,您将获得具有红色突出显示样式的文本
https://i.stack.imgur.com/XSMMB.png
更多信息:https://developer.android.com/jetpack/compose/text?hl=nl#multiple-styles