1、问题产生
正常字符可以正常变红,高亮显示。遇到特殊字符就无效
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tv_volume_add = findViewById<AppCompatTextView>(R.id.tv_volume_add)
//设置关键字变红(字体高亮)
val str = "aaa(ada)euroqij(cba)lih"
val keyword="a(ada)"
val spannableString = SpannableString(str)
val compile = Pattern.compile(keyword)
val matcher = compile.matcher(str)
while (matcher.find()) {
spannableString.setSpan(
ForegroundColorSpan(Color.RED),
matcher.start(),
matcher.end(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
tv_volume_add.text = spannableString
}
以上设置无效
2、原因
括号()需要用转义字符才有效果
3、解决
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tv_volume_add = findViewById<AppCompatTextView>(R.id.tv_volume_add)
//设置关键字变红(字体高亮)
val str = "aaa(ada)euroqij(cba)lih"
//用转义字符
val keyword = "a(ada)".replace("(", "\\(").replace(")", "\\)")
val spannableString = SpannableString(str)
val compile = Pattern.compile(keyword)
val matcher = compile.matcher(str)
while (matcher.find()) {
spannableString.setSpan(
ForegroundColorSpan(Color.RED),
matcher.start(),
matcher.end(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
tv_volume_add.text = spannableString
}
4、问题延伸
对于其他特殊字符是否也需要替换成转义字符,如果数据是动态的,如何做到所有的特殊字符偶读替换