更新于 
部分信息可能已经过时,请谨慎参考本文内容。

实现一个控件内多处可点击事件

轻松处理一个控件内多处点击事件

背景需求

需要在一个TextView控件内存在两个可点击的事件

思路

利用SpannableString实现 重写其updateDrawState方法为false即可

实现

先创建SpannableString并使用其Message信息完整范围内容

1
SpannableString spannableString = new SpannableString(msg);

创建点击事件

1
2
3
4
5
6
7
8
9
10
11
12
ClickableSpan userServiceAgreementClick = new ClickableSpan() {
@Override
public void onClick(View widget) {
//dowork
}
//当前方法重写取消下划线
@Override
public void updateDrawState(@NonNull TextPaint ds) {
ds.setColor(ds.linkColor);
ds.setUnderlineText(false);
}
};

配置点击事件

1
2
3
4
5
/**
* @param userServiceAgreementFirst 指定内容开始下标
* @param userServiceAgreementLast 指定内容结束下标
*/
spannableString.setSpan(userServiceAgreementClick, privacyPolicyFirst, privacyPolicyLast, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

配置颜色

1
spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.public_color_0289FF)), userServiceAgreementFirst, userServiceAgreementLast, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

最后配置效果以及内容

1
2
3
4
5
6
7
8
/**
* @param firstUserXyContext TextView控件实参
* @param setHighlightColor 设置点击效果为透明
* @param setMovementMethod 点击的时候产生超链接
*/
firstUserXyContext.setHighlightColor(Color.TRANSPARENT);
firstUserXyContext.setText(spannableString);
firstUserXyContext.setMovementMethod(LinkMovementMethod.getInstance());

最终收获
SpannableString只允许先设置点击事件然后才能设置色值 否则无效