我遇到了以下问题:我需要为应该将手机输入到 EditText
的情况实现解决方案。这款手机应该有不可移动的部分,最后四个数字应该在开头用下划线填充,然后当用户输入它们时,下划线应该改为数字,例如:+12345____ -> typing 6 -> +123456___
我实现了不可移动的部分。这是我的做法:
binding.etPhoneNumber.filters = arrayOf(InputFilter.LengthFilter(args.phoneNumber?.length ?: 0))
binding.etPhoneNumber.doAfterTextChanged {
val symbolsLeft = it?.toString()?.length ?: 0
if (symbolsLeft < phoneNumberUi.length) {
binding.etPhoneNumber.setText(phoneNumberUi)
binding.etPhoneNumber.setSelection(symbolsLeft + 1)
}
}
但现在我不明白,如何处理带下划线的逻辑。我尝试在 doAfterTextChanged
中附加下划线,例如如果 ((args.phoneNumber?.length ?: 0) > (it?.toString()?.length ?: 0))
附加 n 个下划线,其中 n 是长度之间的差异,但在这种情况下,我无法添加新符号,因为 EditText
已填充且下划线未删除。那么,我该如何解决这个问题呢?提前感谢您的帮助!
最佳答案
您可以删除 LengthFilter
并检查 doAfterTextChanged
中的长度:
val phoneNumberUi = "+12345"
val length = 10
binding.etPhoneNumber.doAfterTextChanged {
when {
it == null -> {
}
// missing / incomplete prefix
it.length < phoneNumberUi.length -> {
it.replace(0, it.length, phoneNumberUi)
}
// prefix was edited
!it.startsWith(phoneNumberUi) -> {
it.replace(0, phoneNumberUi.length, phoneNumberUi)
}
// too short
it.length < length -> {
it.append("_".repeat(length - it.length))
}
// too long
it.length > length -> {
it.replace(length, it.length, "")
}
// set the cursor at the first _
it.indexOf("_") >= 0 -> {
binding.etPhoneNumber.setSelection(it.indexOf("_"))
}
}
}
注意:这里使用 when
因为每次更改都会立即触发对 doAfterTextChanged
的递归调用
关于android - 如何用占位符填充edittext直到它没有被填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68036238/