Изменение цвета английского символа на красный с помощью edittext

Попытка изменить цвет ввода edittext, когда символ является алфавитом. поэтому я добавил textWatcher в edittext и проверил его с помощью регулярного выражения. Похоже, работает нормально, но не работает, когда строка ввода начинается с английского. Когда первая строка ввода начинается с алфавита, тогда числовой текст также меняет цвет на красный, даже если его нет в результате регулярного выражения.

 val regEng = "[a-zA-Z]".toRegex()

  private fun setResources() {
        et_form.addTextChangedListener(editWatcher)
    }

    var editWatcher = object : TextWatcher {
        override fun afterTextChanged(p0: Editable?) {
            p0.let { et ->
            regEng.findAll(et.toString()).map { it.range }.forEach { range ->
                    Log.d("dddd", et.toString()[range.first].toString())
                    et?.setSpan(ForegroundColorSpan(Color.RED), range.first, range.first + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
               }
            }
        }

        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

        override fun onTextChanged(p0: CharSequence?, start: Int, before: Int, count: Int) {
        }

    }

Вот что я пробовал. Если я ввожу 12ABC, то вывод будет выглядеть как

Я ввожу ABC12, тогда вывод выглядит как

1 ответ

Для этого вам нужно будет использовать текст HTML.

String htmlText = et.replace(textToBeColored,"<font 
                color='#c5c5c5'>"+textToBeColored +"</font>");
                et?.setText(Html.fromHtml(htmlText);

Я бы также потенциально изменил регулярное выражение на

(\ D) <- соответствует любому символу без цифр

([a-zA-Z]) <- сгруппирует их, что приведет к меньшему количеству запросов на замену

Другие вопросы по тегам