Jetpack Compose中的textAllCaps

36

我如何在Jetpack Compose中实现与textAllCaps相同的效果?我知道可以使用toUpperCase方法将字符串转换为大写字母,但我想知道是否有属性可以添加到Text组件中,以使文本在视觉上呈现为大写字母?

Text(
    text = stringResource(id = R.string.app_name).toUpperCase(Locale.current)
)
6个回答

34
没有这样的属性,但你可以自己创建它:
@Composable
fun CapsText(
    text: String,
    modifier: Modifier = Modifier,
    color: Color = Color.Unspecified,
    fontSize: TextUnit = TextUnit.Unspecified,
    fontStyle: FontStyle? = null,
    fontWeight: FontWeight? = null,
    fontFamily: FontFamily? = null,
    letterSpacing: TextUnit = TextUnit.Unspecified,
    textDecoration: TextDecoration? = null,
    textAlign: TextAlign? = null,
    lineHeight: TextUnit = TextUnit.Unspecified,
    overflow: TextOverflow = TextOverflow.Clip,
    softWrap: Boolean = true,
    maxLines: Int = Int.MAX_VALUE,
    onTextLayout: (TextLayoutResult) -> Unit = {},
    style: TextStyle = LocalTextStyle.current
) {
    Text(
        text = text.uppercase(),
        modifier = modifier,
        color = color,
        fontSize = fontSize,
        fontStyle = fontStyle,
        fontWeight = fontWeight,
        fontFamily = fontFamily,
        letterSpacing = letterSpacing,
        textDecoration = textDecoration,
        textAlign = textAlign,
        lineHeight = lineHeight,
        overflow = overflow,
        softWrap = softWrap,
        maxLines = maxLines,
        onTextLayout = onTextLayout,
        style = style,
    )
}

1
嗨 @weston。Text 组合有两个版本:一个接受 String,另一个接受 AnnotatedString。我觉得你的修改没有意义,所以我要回滚它。 - Phil Dukhov

24
Text(
    text = stringResource(id = R.string.app_name).uppercase()
)

您可以在stringResource上添加.uppercase()。 目前我正在使用compose 1.2.0-beta03版本。


虽然这不是一个好的实践,对吧?即使函数的时间复杂度为O(N),它仍然是一个算法。在这里有一个讨论:https://issuetracker.google.com/issues/227070850 - Hocine B
@HocineB 是的,你说得对,我不建议在大型项目中使用我的答案。 - Husni

10

.toUpperCase(Locale.current) 已被弃用,应使用 .uppercase() 替代。 以下是使用示例:

Text(
    text = ("any").uppercase()
)

这将作为“任何”在用户界面中呈现。


5
你可以这样做:
keyboardOptions = KeyboardOptions(
            capitalization = KeyboardCapitalization.Characters
        )

以上对我不起作用! - Rucha Bhatt Joshi
1
它可以工作,但你仍然可以通过键盘大写锁定按钮将其变为小写字符。 - Cyph3rCod3r

0

您可以始终使用 String 类的 capitalize 函数。另外,Text 组合也可以将 Annotated String 作为输入,您可以使用 AnnotatedString 的 toUpperCase 函数:

@Preview(showBackground = true)
@Composable
fun Sample() {
    Text(text = upperCased("Hello"))
}

@Composable
fun upperCased(input: String): AnnotatedString {
    return buildAnnotatedString {
        append(input)
//        You can also add styling here as below:
//        
//        withStyle(style = SpanStyle(color = Color.Blue)) {
//            append("John")
//        }
//        append("Doe")
//
//        withStyle(style = SpanStyle(fontWeight = FontWeight.Bold, color = Color.Red)) {
//            append("W")
//        }
//        append("orld")
    }.toUpperCase()
}

我看到这里有一个好处,就是您可以避免在整个应用程序中重复编写样式。

-2
  Text(
                stringResource(id = R.string.main_widget)**.toUpperCase(Locale.getDefault())**,
                fontFamily = aeonikPro,
                fontWeight = FontWeight.Medium,
                color = ColorGraySecondary,
                fontSize = 20.sp
            )

3
我建议您添加一些句子来解释您的代码。对于您的代码,您应该添加代码样式(Ctrl-K)。 - L. Quastana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接