我有一个这样的字符串资源
<string name="my_string">Fancy string with an %1$s placeholder</string>
我想把它作为输出:“Fancy string with anamazingplaceholder”。这是一个字符串,其内容以粗体显示。如何获得所需的输出?
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))
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的列表,精确地说是placeholder和SpanStyle(如果您需要其他东西,可以使用自定义的data class,而不是Pair)。然后迭代list,用对应的SpanStyle将string注解到它们的占位符。
Pair
placeholder
SpanStyle
data class
list
string
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)) }
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") } )
aoyhnmkz5#
用这个
@Composable fun BoldText() { Text("Hello World", fontWeight = FontWeight.Bold) }
src - github /or/ developers
5条答案
按热度按时间bttbmeg01#
最后我得到了想要的结果
vaqhlq812#
我提出了一个稍微更灵活和可重用的解决方案在我的观点,因为上面引用的解决方案是行不通的,如果我们有几个占位符
这基本上需要一个
Pair
的列表,精确地说是placeholder
和SpanStyle
(如果您需要其他东西,可以使用自定义的data class
,而不是Pair
)。然后迭代
list
,用对应的SpanStyle
将string
注解到它们的占位符。nue99wik3#
假设你是在一个Text composable中显示它,请这样做。确保在$字符之前包含一个反斜杠:
vybvopom4#
前面的注解太复杂了,在你的字符串资源中使用html标签就足够了:
如果你正在使用Composable -你可以在某些情况下使用buildAnnotatedString。文档在这里
aoyhnmkz5#
用这个
src - github /or/ developers