【问题标题】:TextField maxLength - Android Jetpack ComposeTextField maxLength - Android Jetpack 撰写
【发布时间】:2021-07-12 02:51:44
【问题描述】:

是否有任何开箱即用的解决方案来限制 TextField 中的字符大小? 我没有看到像 XML 中那样的任何 maxLength 参数。

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案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
              }
          }
      )
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多