【问题标题】:deleting a text on doOnTextChanged deletes the special format of the edit text that I am setting programmatically删除 doOnTextChanged 上的文本会删除我以编程方式设置的编辑文本的特殊格式
【发布时间】:2020-07-22 16:21:12
【问题描述】:

我正在尝试格式化编辑文本,因此当用户键入前两个数字时,会自动添加一个 ',然后在接下来的两个数字键入 . 之后,最终结果如下所示:@ 987654323@ 格式化工作正常,除了当用户删除一个字符时'. 被消除并且文本视图更改为123456。有没有一种方法可以更好地处理编辑文本的格式?这是我的格式化程序的代码:

private fun setCoordenatesFormat(editText: EditText){
    editText.doOnTextChanged { text, start, count, after ->
        
        if(editText.text.length==2){
            editText.setText("${text.toString()}'")
            editText.setSelection(3)
        }
        if(editText.text.length==5){
            editText.setText("${editText.text}.")
            editText.setSelection(6)
        }
    }
}

提前感谢您的帮助

【问题讨论】:

    标签: android kotlin android-edittext text-formatting


    【解决方案1】:

    这不是最好的方法,但您可以尝试检测用户何时删除 textview 以及文本的长度,您可以知道您在哪个段中,并避免删除您想要的格式。您必须使用 TextWatcher 来完成此操作。

    editText.addTextChangedListener(object: TextWatcher{
        override fun afterTextChanged(s: Editable?) {}
        
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            if(after<count){
                    //got deleted
            }
        }
        
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                //your code on textchanged
        }
    })
    

    【讨论】:

    • 非常感谢!我知道这不是最好的方法,但我会尝试使用它并回复您。
    【解决方案2】:

    您插入的特殊字符消失了,因为在您的条件中您正在检查特定长度以格式化字符串。因此,例如,当您检查时:

    if(editText.text.length==5){
                editText.setText("${editText.text}.")
                editText.setSelection(6)
            }
    

    然后,当你从 EditText 中删除最后一个字符时,新字符串的长度应该是 4,它不等于 5,也不等于 2。

    【讨论】:

    • 是的,我注意到了这一点。你知道我可以使用更好的方法来避免这种情况发生吗?
    猜你喜欢
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多