实现一个控件内多处可点击事件
轻松处理一个控件内多处点击事件
背景需求
需要在一个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只允许先设置点击事件然后才能设置色值 否则无效