android Jetpack仅用粗体字符串占位符

gv8xihay  于 2023-03-28  发布在  Android
关注(0)|答案(5)|浏览(126)

我有一个这样的字符串资源

<string name="my_string">Fancy string with an %1$s placeholder</string>

我想把它作为输出:“Fancy string with anamazingplaceholder”。这是一个字符串,其内容以粗体显示。
如何获得所需的输出?

bttbmeg0

bttbmeg01#

最后我得到了想要的结果

val placeholder = "Amazing"

val globalText = stringResource(id = R.string.my_string, placeholder)

val start = globalText.indexOf(placeholder)
val spanStyles = listOf(
    AnnotatedString.Range(SpanStyle(fontWeight = FontWeight.Bold),
        start = start,
        end = start + placeholder.length
    )
)
Text(text = AnnotatedString(text = globalText, spanStyles = spanStyles))
vaqhlq81

vaqhlq812#

我提出了一个稍微更灵活和可重用的解决方案在我的观点,因为上面引用的解决方案是行不通的,如果我们有几个占位符

@Composable
fun annotateRecursively(
    placeHolderList: List<Pair<String, SpanStyle>>,
    originalText: String
): AnnotatedString {
    var annotatedString = buildAnnotatedString { append(originalText) }
    for (item in placeHolderList) {
        annotatedString = buildAnnotatedString {
            val startIndex = annotatedString.indexOf(item.first)
            val endIndex = startIndex + item.first.length
            append(annotatedString)
            addStyle(style = item.second, start = startIndex, end = endIndex)
        }
    }
    return annotatedString
}

这基本上需要一个Pair的列表,精确地说是placeholderSpanStyle(如果您需要其他东西,可以使用自定义的data class,而不是Pair)。
然后迭代list,用对应的SpanStylestring注解到它们的占位符。

nue99wik

nue99wik3#

假设你是在一个Text composable中显示它,请这样做。确保在$字符之前包含一个反斜杠:

Row(modifier = Modifier.wrapContentWidth()) {
    val s = LocalContext.current.getString(R.string.my_string)
    val p = s.indexOf("%1\$s")
    Text(s.substring(0, p))
    Text("amazing", fontWeight = FontWeight.Bold)
    Text(s.substring(p + 4))
}
vybvopom

vybvopom4#

前面的注解太复杂了,在你的字符串资源中使用html标签就足够了:

<string name="my_string">Fancy string with an <b>amazing</b> <i>placeholder</i></string>

如果你正在使用Composable -你可以在某些情况下使用buildAnnotatedString。文档在这里

Text(
        buildAnnotatedString {
            withStyle(style = SpanStyle(fontWeight = FontWeight.Bold, color = Color.Red)) {
                append("W")
            }
            append("orld")
        }
    )
aoyhnmkz

aoyhnmkz5#

用这个

@Composable 
fun BoldText() {
    Text("Hello World", fontWeight = FontWeight.Bold)
}

src - github /or/ developers

相关问题