EditText日期格式化器无法删除首个斜杠,删除操作UI异常
问题原因
你的日期格式化逻辑存在关键问题:当输入的纯数字长度在2到3位之间时,会强制添加第一个斜杠。
具体细节:
- 当用户删除第一个斜杠后,输入会变成无斜杠的2-3位数字(比如
234),此时cleanInput就是这个纯数字串,长度符合textLength >=2 && textLength <4的条件,格式化逻辑会自动重新拼接成带斜杠的形式(23/4),用户的删除操作被覆盖,看起来删不掉第一个斜杠。 - 而第二个斜杠只有在纯数字长度≥5时才会添加,当用户删除第二个斜杠后,纯数字长度回到4位及以下,不满足
textLength >=5的条件,不会被强制添加回去,因此可以正常删除。
修复方案
修改格式化逻辑,不再强制给2-3位的纯数字添加斜杠,仅在用户输入第3个数字时自动添加第一个斜杠,同时允许用户删除斜杠后保留纯数字状态,直到下一次输入。
调整后的代码如下:
internal class DateFormatter { override fun format(input: String): String { // 过滤掉非数字和非斜杠的无效字符 val filteredInput = input.filter { it.isDigit() || it == '/' } val cleanDigits = filteredInput.replace("/", "") val digitLength = cleanDigits.length // 处理末尾斜杠的异常情况 if (filteredInput.endsWith("/")) { return filteredInput.dropLast(1) } // 仅在输入数字触发阈值时自动添加斜杠,其余情况保留用户输入状态 return when { // 输入第3个数字时,自动添加第一个斜杠 digitLength == 3 -> "${cleanDigits.substring(0,2)}/${cleanDigits.substring(2)}" // 输入第5个及以上数字时,自动添加两个斜杠 digitLength >=5 -> "${cleanDigits.substring(0,2)}/${cleanDigits.substring(2,4)}/${cleanDigits.substring(4)}".take(10) // 其他情况返回过滤后的输入,同时去重连续斜杠 else -> filteredInput.replace(Regex("/+"), "/") } } }
逻辑说明
- 非法字符过滤:只保留数字和斜杠,避免无效输入干扰格式。
- 末尾斜杠处理:自动移除用户输入末尾的斜杠,避免格式异常。
- 智能添加斜杠:仅在输入第3个、第5个数字时自动补全斜杠,其余情况尊重用户的输入状态(比如删除斜杠后的纯数字串)。
- 斜杠去重:用正则替换连续多个斜杠为单个,避免格式混乱。
内容的提问来源于stack exchange,提问作者Kennedi Scott
相关产品推荐
相关产品推荐

