【问题标题】:Compose Text Field strange behaviour when setting a max length for text设置文本的最大长度时撰写文本字段的奇怪行为
【发布时间】:2021-10-25 06:01:29
【问题描述】:

我正在尝试为 TextField 中的最大字符数设置一个限制。 这是我尝试过的:

var text by remember { mutableStateOf("") }
val maxLength = 40
TextField(
    value = text,
    onValueChange = {
        text = it.take(maxLength)
    }
)

问题来了:

  • 当我超过限制时,整个文本突然被清除。
  • 这种情况只发生一次,即当我重新输入并超出限制时,它就会停在那里(这是所需的行为)
  • 40 在这里似乎是一个神奇的数字,因为对于 maxLength = 39 或更低,一切正常。当我将限制设置为 40 或更高时,我看到了这种奇怪的行为。 (这个幻数似乎并不取决于文本字段的宽度,因为我尝试了纵向和横向模式,结果是一样的)

如何摆脱这种行为?为 TextField 文本设置最大长度的正确方法是什么?

【问题讨论】:

  • 你的代码对我来说很好。您可能遇到过 Compose 错误,report Compose 问题跟踪器,包括您正在使用的 Android 版本、Compose 版本和设备型号。
  • 看起来就是这种情况。我在我的模拟器上尝试了这段代码,它在那里运行良好。

标签: android kotlin android-jetpack-compose android-jetpack-compose-text


【解决方案1】:

您不应该使用 take() 来限制字符串的数量。

take() 只表示取第一个字符串。

可以考虑字符串本身,判断字符串个数不超过40即可。

var text by remember { mutableStateOf("") }
val maxLength = 40
TextField(
    value = text,
    onValueChange = {
        if (it.length <= 40)
          text = it
    }
)

【讨论】:

  • 这也不行。显示相同的行为。
  • 产生的行为是什么样的?
  • 与附件gif相同。
  • 可能和高宽有关,这个我不确定。
  • 看起来与设备类型有关。我试过在模拟器上运行它,效果很好。
【解决方案2】:

我注意到这个错误不会出现在 Android 12 上,而在 11 及更低版本上会出现。

幸运的是,根据 Google 问题跟踪器,这是一个 TextField 错误,它已在 Jetpack Compose 1.2.0-alpha04 中修复。

查看相关主题 herehere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多