TextField maxLength - Android Jetpack Compose

TextField maxLength - Android Jetpack Compose

是否有现成的解决方案来限制 TextField 中的字符大小? 我没有看到像 XML.

中那样的任何 maxLength 参数

1.x.y 没有内置参数。 您可以使用类似的东西:

var text by remember { mutableStateOf(TextFieldValue("")) }
val maxChar = 5

TextField(
    singleLine = true,
    value = text,
    onValueChange = {
        if (it.length <= maxChar) text = it         
    }
)

另一种可以被认为更灵活的方法是:

Text(
    text = "A string with a lot of charsssssssssssssssssssssssssss"
    modifier = Modifier.fillMaxWidth(.5f),
    maxLines = 1,
    overflow = TextOverflow.Ellipsis
)

这将用 fillMaxWidth 位限制宽度,用 maxLines 部分限制高度。如果这两个约束都满足,文本将溢出并且可以指定溢出的行为

在这种情况下,一旦文本占据了视图的一半或超过一行,它最终会变成 A string with a lot of charsssss...

这个问题的第一个答案很好,但确实在某些情况下会出现错误,当超过允许的字符数时,texfield 的值会被清除。这种失败似乎是由于预测文本,因为如果在 android 中禁用预测文本,则不会发生这种情况。我现在找到的一种解决方法是使用 focusManager 来“限制写入”。

首先,我们需要获取焦点管理器来控制屏幕上的焦点。 我们可以通过在可组合函数中添加这一行来做到这一点:

val focusManager = LocalFocusManager.current

然后,在我们的 TextField 中,我们可以使用 focusManager 来避免用户写入超过 maxChar 限制的内容。我们可以将焦点移动到下一个元素,在超过 maxChar 限制时清除焦点,或者接收 lambda 函数并执行我们想要的操作。这取决于我们。

var text by remember { mutableStateOf(TextFieldValue("")) }
val maxChar = 10

TextField(
    singleLine = true,
    value = text,
    onValueChange = {
        // This line will take (in case the user try to paste a text from the clipboard) only the allowed amount of characters
        text = it.take(maxChar)
        if (it.length > maxChar){
           focusManager.moveFocus(FocusDirection.Down) // Or receive a lambda function
        }
    }
)

用这种方式,用户永远不会写出超过限制所规定的字符数。显然,这是一个替代解决方案,在我的情况下解决了我的问题,现在我们必须等待看他们是否在本地添加它