需求说明,一段字符串点击,个别字,具有点击事件且变色,如下所示:
val a1 = "#我爱我家"
val a2 = "#你爱我家"
val a3 = "#我爱你家"
val a1Span = SpannableString(a1)
val a2Span = SpannableString(a2)
val a3Span = SpannableString(a3)
val a1ClickableSpan = TestClickableSpan(a1, this)
val a2ClickableSpan = TestClickableSpan(a2, this)
val a3ClickableSpan = TestClickableSpan(a3, this)
a1Span.setSpan(a1ClickableSpan, 0, a1.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
a2Span.setSpan(a2ClickableSpan, 0, a2.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
a3Span.setSpan(a3ClickableSpan, 0, a3.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
textView.text = "哈话哈"
textView.append(a1Span)
textView.append("jasfjsdfsa;jfd;skdfl")
textView.append(a2Span)
textView.append(a3Span)
textView.movementMethod = LinkMovementMethod.getInstance()
class TestClickableSpan(val str: String, val mContext: Context) : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
ds.color = Color.BLUE
}
override fun onClick(widget: View) {
Toast.makeText(mContext, str, Toast.LENGTH_SHORT).show()
}
}
**问题:**那如何点击完个别字,取消 textview 本身的点击事件呢??
- 点击ClickableSpan不触发textview的点击事件
- 点击textview,不触发ClickableSpan(这个一般不会有)
// 只要在textview的点击事件加多一个判断即可解决点击ClickableSpan会触发textview的点击事件
// 简单明了,网上看了很多教程,都是重写textview,搞得麻烦,搞半天还没用
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ClassroomLog.log(TAG, "Textview Click listener ");
if (tv.getSelectionStart() == -1 && tv.getSelectionEnd() == -1) {
}
}
});
利用正则匹配显示字段:
val mRegular = "#[\u4e00-\u9fa5\\w]+#"
val pattern = Pattern.compile(mRegular)
val spannableString = SpannableString("#sdjhs# #asdfsdf #+sdhfskd+@@\$\$##sdfsd#")
val matcher = pattern.matcher(spannableString)
if (matcher.find()) {
matcher.reset()
}
while (matcher.find()) {
val topic = matcher.group(0)
// 处理话题##符号
if (topic != null) {
val start = matcher.start(0)
val end = start + topic.length
val foregroundColorSpan = ForegroundColorSpan(Color.BLUE)
val testClickSpan = TestClickSpan(topic, this)
spannableString.setSpan(
testClickSpan,
start,
end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
}
// 要实现文字的点击效果,这里需要做特殊处理
textView.movementMethod = LinkMovementMethod.getInstance()
textView.text = spannableString