android clickspan点击富文本与本身点击事件冲突问题

本文介绍如何处理Android中使用ClickSpan时遇到的点击事件冲突问题。通过自定义NoLineClickSpan类去除链接下划线,并在文本的点击事件中判断是否为超链接,以区分不同点击行为。
 配置文件
<string name="agreement_read_agreed">已阅读并同意以下协议</string>
<string name="mall_service_agreement">《易通商城服务协议》</string>
<string name="privat_policy">《隐私权政策》</string>
<string name="policy_text">%1$s&#8194;%2$s&#8194;%3$s</string>

java代码
String policy_text = getString(R.string.policy_text);
        String agreement_read_agreed = getString(R.string.agreement_read_agreed);
        String mall_service_agreement = getString(R.string.mall_service_agreement);
        String privat_policy = getString(R.string.privat_policy);
        Log.d("====2222====",policy_text.length()+"");

        String format_policy_text = String.format(policy_text, agreement_read_agreed,
                mall_service_agreement, privat_policy);
        SpannableString SpannableString = new SpannableString(format_policy_text);
        SpannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#999999")), 0, agreement_read_agreed.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        SpannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#333333")), 11, 11+mall_service_agreement.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        SpannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#333333")), 12+mall_service_agreement.length(), format_policy_text.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        SpannableString.setSpan(new NoLineClickSpan("1"), 11, 11+mall_service_agreement.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        policyText.setMovementMethod(LinkMovementMethod.getInstance());
        SpannableString.setSpan(new NoLineClickSpan("2"), 12+mall_service_agreement.length(), format_policy_text.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        policyText.setText(SpannableString);
//        policyText.setMovementMethod(LinkMovementMethod.getInstance());
        policyText.setMovementMethod(ClickableMovementMethod.getInstance());
        policyText.setClickable(false);
        policyText.setLongClickable(false);
        policyText.setOnClickListener(this);



效果图


点击事件的处理

private class NoLineClickSpan extends ClickableSpan {
        String text;

        public NoLineClickSpan(String text) {
            super();
            this.text = text;
        }

        @Override
        public void updateDrawState(TextPaint ds) {
//            ds.setColor(ds.linkColor);
              ds.setColor(Color.parseColor("#333333"));
            ds.setUnderlineText(false); //去掉下划线
        }

        @Override
        public void onClick(View widget) {

            if (text.equals("1")){
                Log.d("====2222====","1");
            }else if (text.equals("2")){
                Log.d("====2222====","2");
            }

        }
    }

整体的点击事件的处理
case R.id.policy_text:
    if (policyText.getSelectionStart() == -1 && policyText.getSelectionEnd() == -1) {
        //This condition will satisfy only when it is not an autolinked text
        //Fired only when you touch the part of the text that is not hyperlinked
        Log.d("====2222====","3");
    }
break                ;


stackoverflow详细的解决方法与解释
https://stackoverflow.com/questions/16792963/android-clickablespan-intercepts-the-click-event

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值