Маска для номера российских авто
Нужно реализовать маску под российские автомобильные номера. Пробую через кастомный InputFIlter. Проблема в том, что в некоторых случаях вместо последнего введенного символа подставляется весь текст - соответственно текст дублируется. Фото для примера: вместо 7 подставился весь текст
Код
class CustomInputFiler : InputFilter {
private val listChars = listOf('А', 'В', 'Е', 'К', 'М', 'Н', 'О', 'Р', 'С', 'Т', 'У', 'Х',
'A', 'B', 'E', 'K', 'M', 'H', 'O', 'P', 'C', 'T', 'Y', 'X')
override fun filter(
source: CharSequence,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence {
return when {
// корректное удаление (должно быть первым)
dend > dstart && end == 0 -> ""
// проверка первого символа
dend == 0 -> checkOnLatin(value = source, dest = (dest?.isEmpty()) as Spanned)
// проверка 3 цифр
dend == 1 -> checkOnDigits(digit = source, dest = (dest?.isEmpty()) as Spanned)
dend == 2 -> checkOnDigits(digit = source, dest = (dest?.isEmpty()) as Spanned)
dend == 3 -> checkOnDigits(digit = source, dest = (dest?.isEmpty()) as Spanned)
// проверка 2 букв после цифр
dend == 4 -> checkOnLatin(value = source, dest = (dest?.isEmpty()) as Spanned)
dend == 5 -> checkOnLatin(value = source, dest = (dest?.isEmpty()) as Spanned)
// проверка 3 знаков для региона
dend == 6 -> checkOnDigits(digit = source, dest = (dest?.isEmpty()) as Spanned)
dend == 7 -> checkOnDigits(digit = source, dest = (dest?.isEmpty()) as Spanned)
dend == 8 -> checkOnDigits(digit = source, dest = (dest?.isEmpty()) as Spanned)
else -> ""
}
}
private fun checkOnLatin(value: CharSequence, dest: Spanned): String {
return if (listChars.any { charInList ->
charInList.toString() == value.last().toString()
})
"$dest${value.last()}"
else
"$dest"
}
private fun checkOnDigits(digit: CharSequence, dest: Spanned) =
if (digit.last().toString().isDigitsOnly())
"$dest${digit.last()}"
else
"$dest"
}
