Android Jetpack Compose:如何显示字符串资源中的样式文本

时间:2021-07-27 17:18:13

标签: android kotlin android-jetpack-compose android-jetpack-compose-text

我的 strings.xml 中有一个字符串,它针对不同的语言进行了本地化。 字符串的样式为每个本地化的 Html 标记。

使用 Android TextView,我能够通过读取字符串资源很好地显示样式文本。

考虑到 Jetpack Compose 当前 (1.0.0-rc02) 不支持 Html 标签,我尝试在 TextView 可组合内使用 AndroidView 官方文档: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

1 个答案:

答案 0 :(得分:1)

stringResource 在底层使用 resources.getString,它丢弃任何样式信息。您需要创建类似 textResource 的内容来获取原始值:

@Composable
@ReadOnlyComposable
fun textResource(@StringRes id: Int): CharSequence =
    LocalContext.current.resources.getText(id)

像这样使用它:

StyledText(textResource(id = R.string.foo))

@Composable
fun StyledText(text: CharSequence, modifier: Modifier = Modifier) {
    AndroidView(
        modifier = modifier,
        factory = { context -> TextView(context) },
        update = {
            it.text = text
        }
    )
}