android format edittext to display spaces after every 4 characters

前端 未结 12 1720
傲寒
傲寒 2020-12-10 13:27

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

12条回答
  •  被撕碎了的回忆
    2020-12-10 13:34

    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)
                    }
                }
            })
    

提交回复
热议问题