TextWatcher предотвращает удаление всей строки из EditText, просто char to char - PullRequest
0 голосов
/ 08 октября 2018

У меня есть один Editext, который использует TextWatcher, чтобы создать маску валюты.

Работает нормально, но когда я пытаюсь удалить текст, нажимая и удерживая клавишу Backspace на программной клавиатуре, текст нестерты, если я не повторил, нажмите клавишу несколько раз.

Я думаю, что это может быть потому, что при каждом изменении текста мне приходится вызывать setText, и это мешает работе.

Любое предложение?

    myEditText.addTextChangedListener(object : TextWatcher {
        override fun onTextChanged(s: CharSequence, start: Int,
                                   before: Int, count: Int) {

        }

        override fun beforeTextChanged(s: CharSequence, start: Int,
                                       count: Int, after: Int) {
        }

        override fun afterTextChanged(editable: Editable) {
            myEditText.removeTextChangedListener(this)

            val parsed = parseToBigDecimal(editable.toString(), locale)
            val formatted = NumberFormat.getCurrencyInstance(locale).format(parsed)

            myEditText.setText(formatted)
            myEditText.setSelection(formatted.length)
            myEditText.addTextChangedListener(this)

        }
    })



private fun parseToBigDecimal(value: String, locale: Locale): BigDecimal {
    val replaceable = String.format("[%s,.\\s]", NumberFormat.getCurrencyInstance(locale).currency.symbol)

    val cleanString = value.replace(replaceable.toRegex(), "")

    return BigDecimal(cleanString).setScale(
            2, BigDecimal.ROUND_FLOOR).divide(BigDecimal(100), BigDecimal.ROUND_FLOOR
    )
}

1 Ответ

0 голосов
/ 09 октября 2018

В одном из этих методов вы можете определить, был ли удален текст.Затем вы можете установить флаг, чтобы пропустить / обработать / дифференцировать все, что находится в afterTextChanged.

    override fun onTextChanged(s: CharSequence, start: Int,
                               before: Int, count: Int) {

    }

    override fun beforeTextChanged(s: CharSequence, start: Int,
                                   count: Int, after: Int) {
    }
...