我正在尝试制作一个信用格式文本字段。一切正常,直到您填满所有字符然后尝试删除一些字符。对我做错了什么有什么想法吗?
// XXXX-XXXX-XXXX-XXXX
var text by remember { mutableStateOf("") }
OutlinedTextField(
value = text,
onValueChange = {
if(text.length <=16)
text = it
},
visualTransformation = object : VisualTransformation {
override fun filter(text: AnnotatedString): TransformedText {
val trimmed = if (text.text.length >= 16) text.text.substring(0..15) else text.text
var out = ""
for (i in trimmed.indices) {
out += trimmed[i]
if (i % 4 == 3 && i != 15) out += "-"
}
return TransformedText(
AnnotatedString(out),
creditCardOffsetMapping
)
}
}
)
// Making XXXX-XXXX-XXXX-XXXX string.
val creditCardOffsetMapping = object : OffsetMapping {
override fun originalToTransformed(offset: Int): Int {
if (offset <= 3) return offset
if (offset <= 7) return offset + 1
if (offset <= 11) return offset + 2
if (offset <= 16) return offset + 3
return 19
}
override fun transformedToOriginal(offset: Int): Int {
if (offset <= 4) return offset
if (offset <= 9) return offset - 1
if (offset <= 14) return offset - 2
if (offset <= 19) return offset - 3
return 16
}
}
用户在 Kotlin 中遇到信用卡格式文本字段的问题。当达到最大长度后尝试删除字符时会出现问题。在这个答案中,我将提供一个更正的代码解决方案来解决这个问题。
让我们首先展示信用卡格式文本字段的更正代码:
var text by remember { mutableStateOf("") }
OutlinedTextField(
value = text,
onValueChange = {
// Only allow digits and "-"
val formattedText = it.filter { char -> char.isDigit() || char == '-' }
// Limit the length to 19 characters (to allow for 16 digits and 3 hyphens)
if (formattedText.length <= 19) {
text = formattedText
}
},
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number
),
visualTransformation = object : VisualTransformation {
override fun filter(text: AnnotatedString): TransformedText {
val trimmed = if (text.text.length >= 19) text.text.substring(0..18) else text.text
var out = ""
for (i in trimmed.indices) {
out += trimmed[i]
if (i % 5 == 3 && i != 18) out += "-"
}
return TransformedText(
AnnotatedString(out),
creditCardOffsetMapping
)
}
}
)
此更新的代码有效解决了 Kotlin 中信用卡格式文本字段中的字符删除问题。它允许用户输入和删除字符,同时保持所需的格式(XXX-XXX-XXX-XXX-XXX)。
其他提示: