Format EditText value as DD/MM/YYYY (Android)

Viewed 75

I need to format the data entered in EditText as DD/MM/YY. When user enters 2 digits for day (DD), a '/' should be inserted, then after the user enters 2 digits for month (MM) naother '/' has to be inserted.

I tried to achieve it with TextWatcher as:

editText?.addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(charSequence: CharSequence?, i: Int, i1: Int, i2: Int) {}
        override fun onTextChanged(charSequence: CharSequence?, i: Int, i1: Int, i2: Int) {
        }

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        override fun afterTextChanged(editable: Editable?) {

            var s: String = editable.toString()

            if (editable.toString() != "" && editable.toString() != " ") {

                   //Below code for formatting date as DD/MM/YYYY

                    var str = s
                    if (s.contains("/")) {
                        str = s.replace("/", "") //Remove all '/'
                    }


                    if (str.length == 2 ) {
                        str= str.toCharArray().also { it[2] = '/' }.joinToString("")
                    }

                     else if (str.length == 4) {
                        str = str.toCharArray().also { it[2] = '/' }.joinToString("")
                        str = str.toCharArray().also { it[5] = '/' }.joinToString("")
                    }

                    editText.removeTextChangedListener(this) //To prevent infinite loop
                    editText.setText(str)
                    editText.setSelection(editText.length()) //fix reverse texting
                    editText.addTextChangedListener(this)
}
}

But my app crashes after I type the second character in EditText.

Please suggest a solution.

1 Answers

Did this inside afteTextChanged():

 var s: String = editable.toString()
    
                if (editable.toString() != "" && editable.toString() != " ") {
    
                        var str= s

                        if (s.contains("/")) {
                            str = s.replace("/", "") //Remove all '/'
                        }
    
    
                        if (str.length == 2 ) {
                            str += "/"
                            s = str
                        }
    
                         else if (str.length == 4) {
                            //CHANGED LOGIC BELOW FOR APPENDING "/"

                             str = (str.subSequence(0, 2)).toString() + "/" + (str.subSequence(2, 4)).toString() + "/"
    
                            s = str
                        }
    
    
                        editText.removeTextChangedListener(this) //To prevent infinite loop
                        editText.setText(s)
                        editText.setSelection(editText.length()) //Fix reverse texting
                        editText.addTextChangedListener(this)
    }

Seems to be working well so far.

Related