【问题标题】:Format EditText value as DD/MM/YYYY (Android)将 EditText 值格式化为 DD/MM/YYYY (Android)
【发布时间】:2021-08-18 09:37:00
【问题描述】:

我需要将 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 中键入第二个字符后,我的应用程序崩溃了。

请提出解决方案。

【问题讨论】:

    标签: android android-edittext string-formatting


    【解决方案1】:

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

    目前看来运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 2018-04-02
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2021-12-18
      相关资源
      最近更新 更多