Android EditText在追加后替换字符

Android EditText在追加后替换字符,android,kotlin,android-edittext,Android,Kotlin,Android Edittext,我想让一个数字看起来像这样 932-874838/9 我用我的EditText将-和/附加在一些空格之后 editText.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(text: Editable?) { } override fun beforeTextChanged(s: CharSequence?, sta

我想让一个数字看起来像这样

932-874838/9

我用我的EditText将
-
/
附加在一些空格之后

 editText.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(text: Editable?) {

            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                onValueChange(s.toString())
            }
        })
}
private fun onValueChange(value: String) {

        mNumberTxtView.text = value

        if (value.length == 3) {
            mNumberTxtView.append("-")
        }

        if (value.length == 10) {
            mNumberTxtView.append("/")
        }
    }
当我像这样打字的时候

932

它会自动附加
-
,这样就行了,但在附加
-
之后,如果我键入另一个数字,它会用该数字替换
-
,而不是继续,因此它最初会变为
932-
,但在尝试输入另一个数字时

9328

它被替换为删除附加的
-


我认为问题出在
onValueChange()
方法中

onValueChange
应该是这样的:

var test: StringBuilder = StringBuilder()
var lastValue: String = ""

fun onValueChange(value: String) {

    if(lastValue.length > value.length) {
        test.deleteCharAt(test.lastIndex)
        if(test.length == 3 || test.length == 10) {
            test.deleteCharAt(test.lastIndex)
        }
    } else {
        test.append(value.last())

        if (test.length == 3) {
            test.append("-")
        } else if (test.length == 10) {
            test.append("/")
        }
    }

    lastValue = value
    textView.text = test
}

onValueChange
应该是这样的:

var test: StringBuilder = StringBuilder()
var lastValue: String = ""

fun onValueChange(value: String) {

    if(lastValue.length > value.length) {
        test.deleteCharAt(test.lastIndex)
        if(test.length == 3 || test.length == 10) {
            test.deleteCharAt(test.lastIndex)
        }
    } else {
        test.append(value.last())

        if (test.length == 3) {
            test.append("-")
        } else if (test.length == 10) {
            test.append("/")
        }
    }

    lastValue = value
    textView.text = test
}
试试这个

private fun onValueChange(value: String) {

    if (value.length == 3) {
        mNumberTxtView.text = "${value}_"
    } else if (value.length == 10) {
        mNumberTxtView.text = "${value}/"
    }

}
让我知道这是否有效

(字符串中围绕“value”的花括号可能没有必要。我仍然习惯于Kotlin处理字符串连接的方式。)

编辑以删除冗余和可能导致循环的零件。

请尝试此操作

private fun onValueChange(value: String) {

    if (value.length == 3) {
        mNumberTxtView.text = "${value}_"
    } else if (value.length == 10) {
        mNumberTxtView.text = "${value}/"
    }

}
让我知道这是否有效

(字符串中围绕“value”的花括号可能没有必要。我仍然习惯于Kotlin处理字符串连接的方式。)


编辑以删除冗余和可能导致循环的部分。

您不应在
文本更改之前的
文本更改之后的
中更改文本,以防止
文本观察者重新调用这些方法。在
后文本更改中进行更改
。 但要小心不要让自己陷入无限循环,因为您所做的任何更改都会导致再次递归调用此方法

因此,将调用
onValueChanged
设置为
posterextchanged
方法


删除
mNumberTxtView.text=value

后,您不应在
文本更改前和
文本更改后更改文本,以防止
文本观察者重新调用这些方法。在
后文本更改中进行更改
。 但要小心不要让自己陷入无限循环,因为您所做的任何更改都会导致再次递归调用此方法

因此,将调用
onValueChanged
设置为
posterextchanged
方法


删除
mNumberTxtView.text=value

只会有一个问题,当我删除一个数字时,它会不断向文本中添加数字,并在您的时间内大量崩溃。只有一个问题,当我删除一个数字时,它会不断向文本中添加数字,并在您的时间内大量崩溃