在 Jetpack Compose TextField 中操作/更改键盘输入

时间:2021-02-02 00:25:56

标签: android android-jetpack-compose

Jetpack Compose 中是否有一种方法可以在 TextField 中输入的每个字符在实际显示之前使用 mapper : (String) -> String 函数进行处理,该函数可能会随着时间的推移而改变。

我尝试用 TextField 实现这个

var value  by remember { mutableStateOf("") }

TextField(value = value, onValueChange = {
   //I could perform manipulation here
   value = it
})

但它不起作用,因为它正在操纵整个文本而不是最近的字符。此外,在此过程中更改光标位置或更改映射器功能时会导致可预测的行为

注意:VisualTransformation 也不合适。它应用于整个文本

我认为我们必须从另一层解决这个问题。有没有办法在 Jetpack Compose 中实现这种行为?

2 个答案:

答案 0 :(得分:1)

我在使用 compose 实现文本验证 UI 时遇到了类似的挑战。由于输入焦点未处于就绪状态,我最终对仅需要数字的输入执行以下操作。

onValueChange = {
        // only accept the first number value entered
        number = it.text.replace(Regex("\\D"), "").take(1)

        // move to the next field
        if (number.isNotEmpty()) {
            nextFocus?.requestFocus() ?: run {
                onVerifyPin?.invoke()
            }
        }
    }

使用正则表达式和 kotlin 的最后一个运算符,您可以获得所需的结果。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/last.html

答案 1 :(得分:-1)

如果你只是做这样的事情:

TextField(
    label = { Text("Name") },
    value = nameState,
    onValueChange = { s: String ->
        if (!s.contains('b')) { // <<<<<< this
            nameState = s
        }
    }
)

如果您按键盘上的“b”,则不会发生任何事情。 没有文字变化,没有光标动画变化,......没有...... 也许我没有正确理解你...