TextField maxLength - Android Jetpack 撰写
Posted
技术标签:
【中文标题】TextField maxLength - Android Jetpack 撰写【英文标题】:TextField maxLength - Android Jetpack Compose 【发布时间】:2021-07-12 02:51:44 【问题描述】:是否有任何开箱即用的解决方案来限制 TextField 中的字符大小? 我没有看到像 XML 中那样的任何 maxLength 参数。
【问题讨论】:
【参考方案1】:1.x.y
没有内置参数。
你可以使用类似的东西:
var text by remember mutableStateOf(TextFieldValue(""))
val maxChar = 5
TextField(
singleLine = true,
value = text,
onValueChange =
if (it.length <= maxChar) text = it
)
【讨论】:
当使用你的 sn-p 时,如果你输入maxChar
chars 它工作正常。然后对于下一个字符,它不会显示任何新字符(正确行为),但是当输入另一个字符(maxChar = 5
的第 7 个字符)时,它会清除TextField
并允许输入新字符。任何解释为什么它会这样并且可能修复?
粘贴长文本是否适用于实现? text = it.take(maxChar)
不是更好吗?
@adek111 我面临同样的问题。你找到解决办法了吗?
@Sahil,很遗憾没有,仍在等待 Gabriele 的解释
@adek111 我面临同样的问题。你找到解决办法了吗?【参考方案2】:
另一种被认为更灵活的方法是:
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...
【讨论】:
【参考方案3】:这个问题的第一个答案工作正常,但确实在某些情况下会出现错误,即当超过允许的字符数时,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
)
这样,用户写入的字符数永远不会超过限制所确定的字符数。显然,这是一个替代解决方案,在我的情况下解决了我的问题,现在我们必须等待看看他们是否在本地添加它
【讨论】:
以上是关于TextField maxLength - Android Jetpack 撰写的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter 中隐藏 TextField 底部的字母计数器