Android - I want to get a number input from the user into an EditText - it needs to be separated by spaces - every 4 characters. Example: 123456781234 -> 1234 5678 1234
I have created a class that encapsulates the given behavior.
/**
* Custom [TextWatcher] class that appends a given [separator] for every [interval].
*/
abstract class SeparatorTextWatcher(
private val separator: Char,
private val interval: Int
) : TextWatcher {
private var dirty = false
private var isDelete = false
override fun afterTextChanged(editable: Editable?) {
if (dirty) return
dirty = true
val text = editable.toString().handleSeparator()
onAfterTextChanged(text)
dirty = false
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
// Empty
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
isDelete = before != 0
}
private fun String.handleSeparator(): String {
val stringBuilder = StringBuilder(this)
if (length > 0 && length.rem(interval + 1) == 0) {
if (isDelete) {
stringBuilder.deleteCharAt(length - 1)
} else {
stringBuilder.insert(length - 1, separator)
}
}
return stringBuilder.toString()
}
/**
* Subclasses must implement this method to get the formatted text.
*/
abstract fun onAfterTextChanged(text: String)
}
Here's a snippet on how to use it:
editText.addTextChangedListener(object : SeparatorTextWatcher(' ', 4) {
override fun onAfterTextChanged(text: String) {
editText.run {
setText(text)
setSelection(text.length)
}
}
})