如何使用正则表达式更改特定文本的颜色,Android中的SpannableString。



尝试在编辑文本字段的输入中更改英文文本的颜色。 在编辑文本中添加Textwatcher,并在afterTextchanged方法中调用方法。

val regEng = Pattern.compile("[a-zA-Z]")
var editWatcher = object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {
onChanged()
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, start: Int, before: Int, count: Int) {
}
}
private fun onChanged() {
var spanString = SpannableStringBuilder()
var input = et_form.text.toString()
for (i in 0 until input.length) {
val char = input[i].toString()
var matcher = regEng.matcher(char)
if (matcher.find()) {
val engspan = SpannableString(char).apply {
setSpan(ForegroundColorSpan(Color.RED), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
spanString.append(engspan)
} else {
val normal = SpannableString(char).apply {
setSpan(ForegroundColorSpan(Color.BLACK), i, char.length - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
spanString.append(normal)
}
}
}

但它不起作用,当我添加代码时

edittext.text = spanString

它不会停止并继续调用onchanged方法。

因为在 editText 中的每个编辑中,您都在更改字符串。以此类推,每次都会调用更改。因此,要停止循环访问onChange,您需要设置一个条件。这可能是:

private previousLength = 0

if(input.length != previousLength) {
onChanged()
}

每次更改完成后,您都会更新

previousLength = input.length;

我建议你使用 span 来防止无限调用侦听器,并将可编辑传递给 onChanged(( 方法。

private fun onChanged(s: Editable)  {
if(s.isEmpty() || s.getSpans(0,s.length,YourSpanClass::class.java).isNotEmpty()
return
val span = YourSpanClass()
s.setSpan(span,0,1,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
// do whatever you want on s and update it
s.removeSpan(span)
}

说明:首次设置 span 时,在更改结束并删除该 span 之前,它始终从代码的第一行返回,因此将防止无限侦听器调用。删除 span 后,将只应用一次 s 的更改。

如果您不会将 s 复制到另一个 Spanned 中,则可以使用

class YourSpanClass: NoCopySpan

相关内容

  • 没有找到相关文章

最新更新