首页 > 解决方案 > 将 EditText 值格式化为 DD/MM/YYYY (Android)

问题描述

我需要将 EditText 中输入的数据格式化为 DD/MM/YY。当用户输入 2 位日期 (DD) 时,应插入“/”,然后在用户输入 2 位月份 (MM) 后,必须插入另一个“/”。

我试图用 TextWatcher 来实现它:

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

但是在我在 EditText 中键入第二个字符后,我的应用程序崩溃了。

请提出解决方案。

标签: androidandroid-edittextstring-formatting

解决方案


在 afterTextChanged() 里面做了这个:

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

到目前为止似乎运作良好。


推荐阅读