【问题标题】:Allow ONLY characters as input in TextField仅允许在 TextField 中输入字符
【发布时间】:2021-07-22 13:57:09
【问题描述】:

我试图让我的 TextField 只接受使用 keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) 的字符:

      TextField(
                value = query3.value,
                onValueChange = { newValue ->
                    query3.value = newValue
                },
                singleLine = true,
                label = {
                    Text(
                        "Bank name",
                        color = colorResource(id = R.color.bright_green),
                        fontFamily = FontFamily(Font(R.font.poppins_regular)),
                        fontSize = with(LocalDensity.current) { dimensionResource(id = 
                        R.dimen._12ssp).toSp() },
                        )
                },
                interactionSource = interactionSource,
                keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text),
                 .
                 .
                 .

但软键盘仍然允许输入数字。如何让软键盘只允许输入字符?

【问题讨论】:

  • 检查 onValueChange 如果新值有一个数字,如果没有分配它,否则忽略它。
  • 我希望键盘根本不显示数字,只显示字符。

标签: android textfield android-softkeyboard android-jetpack-compose


【解决方案1】:

您需要过滤掉文本字段回调中的数字,

TextField(
            value = query3.value,
            onValueChange = { newValue ->
                query3.value = newValue.filter { !it.isDigit() }
            },
            singleLine = true,

【讨论】:

  • 需要注意的是,虽然这可行,但如果在 onValueChange 内部的代码行上放置断点,它将失败。这似乎是调试期间 Compose 中的一些古怪错误,我花了好几个小时来确定代码在没有断点的情况下确实在工作。
【解决方案2】:

恐怕 Android 不支持此功能。是的,如果您希望用户只能输入一组指定的字符,那么在onValueChange 中将其过滤掉或使用过滤器将是正确的选择。看到,因为在只允许用户输入数字的情况下,键盘仍将(始终)显示星号和(可能)加号键,即使在单击它们时未输入它们。如果你想要一个只有特定数字的键盘,恐怕你必须设计自己的键盘(应用程序内),这不是用 Compose 很难实现的。这是小菜一碟

【讨论】:

  • 嘿顺便说一句,如果你使用类似var query3 = mutableStateOf ("")的东西,我认为你应该使用var query3 by mutableStateOf ("")这样的语法糖。你看如果你使用它,其他一切都保持不变。触发重组。您只是不需要每次都写.value,并且可以像使用常规变量一样使用状态持有者。
  • by 关键字有助于将任何撰写状态视为状态类型。至少对于原始类型是这样,我认为对于自定义类型,您需要定义一些委托
【解决方案3】:
usersAnswer.value = it.filter{ it.isLetter() || it.isWhitespace() }.lowercase()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2021-11-18
    • 2020-06-25
    • 1970-01-01
    • 2022-12-04
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多