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 底部的字母计数器

Flutter——限制TextField只能输入汉字或英文字母或数字,并限制输入最多中文5字符,英文10字符

输入框提示字

设置UITextField的最大字符长度

thinkphp 限制一天的注册次数;

你能让 TextField<BigDecimal> 同时接受 , 和 .作为小数分隔符?