Jetpack 将数字输入到文本字段

问题描述 投票:0回答:2

当键盘的 KeyboardType 设置为 KeyboardType.Number 时,我当前无法捕获用户在文本字段中的输入。

如果键盘设置为 KeyboardType.Text,文本字段会按预期更新,但是当设置为 KeyboardType.Number 时,文本字段将无法更新。

这是为什么呢?以及如何更改我的代码,以便当单击文本字段时,显示数字键盘,并且当按下数字时,相关数字会在文本字段中更新。

以下代码不会更新文本字段(当设置为 KeyboardType.Number 时)...

@Composable
fun MyNumberField() {

    var text = remember { mutableStateOf("")}

    val change : (String) -> Unit = { it ->
        value.value = it
    }

    TextField(
        value = text.value,
        modifier = Modifier.fillMaxWidth(),
        keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
        onValueChange = change
    )

}

以下代码确实更新了文本字段(当设置为 KeyboardType.Text 时)...

@Composable
fun MyNumberField() {

    var text = remember { mutableStateOf("")}

    val change : (String) -> Unit = { it ->
        text.value = it
    }

    TextField(
        value = value.value,
        modifier = Modifier.fillMaxWidth(),
        keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text),
        onValueChange = change
    )

}

非常感谢

android user-input textfield android-jetpack android-jetpack-compose
2个回答
16
投票

您应该更新

text.value
,而不是
value.value
您的代码中存在拼写错误,请将其更改为此。

@Composable
fun MyNumberField() {

    var text = remember { mutableStateOf("")}

    val change : (String) -> Unit = { it ->
        value.value = it    // you have this which is not correct and I don't think it even compiled
        text.value = it  // it is supposed to be this 
    }

    TextField(
        value = text.value,
        modifier = Modifier.fillMaxWidth(),
        keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
        onValueChange = change
    )

}

0
投票

我会更进一步,使用 MutableIntState 并检查所有输入的文本是否都是 Int。

@Composable
fun MyNumberField() {

    var number = remember { mutableIntStateOf("")}

    val change : (String) -> Unit = { it ->
        number = it.toIntOrNull() ?: number 
    }
 ...
© www.soinside.com 2019 - 2024. All rights reserved.