我正在尝试创建一个可重用的NumberField组件:
@Composable
fun NumberField(
value: Number?,
onNumberChange: (Number) -> Unit,
) {
TextField(
value = value?.toString() ?: "",
onValueChange = {
it.toDoubleOrNull()?.let { value ->
if (value % 1.0 == 0.0) {
onNumberChange(value.toInt())
} else {
onNumberChange(value)
}
}
},
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
}用作:
@Composable
fun NumberContent() {
val number = remember { mutableStateOf<Number?>(null) }
NumberField(value = number.value) {
number.value = it
}
}我希望该数字是一个整数或双精度,这取决于用户正在键入的内容。在您尝试输入一个十进制数之前,我上面的方法都是有效的,因为它看起来是"5.",不会被解析为双精度。我想让用户输入5.然后填入rest。因此,我不想在decimal后面自动添加一个零,因为这可能不是他们想要输入的下一个数字。这是最好的方法吗?我知道我可以接受任何文本,然后尝试将他们后来输入的文本格式化为int或double,然后让他们修复它,只是觉得把它们都捆绑在composable中会很好。
发布于 2021-05-31 04:42:35
您可以使用类似以下内容:
TextField(
value = text,
onValueChange = {
if (it.isEmpty()){
text = it
} else {
text = when (it.toDoubleOrNull()) {
null -> text //old value
else -> it //new value
}
}
},
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)

发布于 2021-06-01 02:04:35
这里是一个实现,它处理所有声明的条件,同时还向父母公开状态。
@Composable
fun NumberField(
value: Number?,
onNumberChange: (Number?) -> Unit,
) {
val number = remember { mutableStateOf(value) }
val textValue = remember(value != number.value) {
number.value = value
mutableStateOf(value?.toDouble()?.let {
if (it % 1.0 == 0.0) {
it.toInt().toString()
} else {
it.toString()
}
} ?: "")
}
val numberRegex = remember { "[-]?[\\d]*[.]?[\\d]*".toRegex() }
// for no negative numbers use "[\d]*[.]?[\d]*"
TextField(
value = textValue.value,
onValueChange = {
if (numberRegex.matches(it)) {
textValue.value = it
number.value = it.toDoubleOrNull()
onNumberChange(number.value)
}
},
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
}示例用法如下所示。
@Composable
fun DemoUsage() {
Column {
val number = remember { mutableStateOf<Number?>(null) }
NumberField(value = number.value) {
number.value = it
}
Button(onClick = { number.value = number.value?.toDouble()?.plus(1) }) {
Text("Increment")
}
}
}https://stackoverflow.com/questions/67589909
复制相似问题