EditText заменяет символ после добавления - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь сделать число похожим на это

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-, но при попытке ввести другое число

932 8

заменяется так же, как и удаление добавленного -

Я думаю, что проблема в методе onValueChange()

Ответы [ 3 ]

1 голос
/ 09 октября 2019

Попробуйте вместо этого.

private fun onValueChange(value: String) {

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

}

Дайте мне знать, если это работает.

(В фигурных скобках вокруг «значения» в строках может не быть необходимости. Я все еще привыкаю к ​​тому, как Котлин обрабатывает строкиобъединение.)

Отредактировано для удаления избыточной и потенциально вызывающей петли детали.

1 голос
/ 09 октября 2019

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
}
0 голосов
/ 09 октября 2019

Вы не должны изменять текст в beforeTextChanged и afterTextChanged, чтобы предотвратить повторный вызов этих методов на TextWatcher. Внесите изменения в afterTextChanged. Но будьте осторожны, чтобы не оказаться в бесконечном цикле, потому что любые внесенные вами изменения приведут к повторному вызову этого метода.

Поэтому установите вызов onValueChanged в afterTextChanged метод

с удалением mNumberTxtView.text = value

...