tinkoff-mobile-tech / decoro

Android library designed for automatic formatting of text input by custom rules
Apache License 2.0
391 stars 31 forks source link

Поменять цвет маски #53

Open Sash0k opened 4 years ago

Sash0k commented 4 years ago

Добрый вечер, не нашёл в текущей версии такой возможности. При включенном отображении маски она выводится тем же цветом, что и вводимое значение. Было бы удобно отображать её цветом хинта, либо добавить возможность настраивать свой цвет.

sample

m4xp1 commented 3 years ago

У меня получилось решить эту задачу следующим образом:

editText.addTextChangedListener(afterTextChanged = { text ->
  // For keep cursor position see this answer: https://stackoverflow.com/a/68339818/3094065
  invalidateMaskColor(text)
})

private fun invalidateMaskColor(text: Editable?) {
  if (text == null) return

  text.getSpans(0, text.length, ForegroundColorSpan::class.java)
    .forEach { span -> text.removeSpan(span) }

  val mask = formatWatcher?.mask ?: return
  if (text.toString() == mask.toString()) {
    val color = placeholderTextColor
      ?.getColorForState(editText?.drawableState, Color.TRANSPARENT) ?: Color.TRANSPARENT
    val span = ForegroundColorSpan(color)

    text.setSpan(span, mask.initialInputPosition, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
  }
}