聊天的时候使用TextView拦截超文本连接并替换

做视频聊天的时候,有时候我们要处理超链接文本,当我们从服务端读取的时候,就要进行过滤,并替换处理,比如替换成网页连接、网页失效等等;过滤方法如下代码:

    /**
     * 拦截超链接文本
     */
    private void interceptHyperLink(TextView tv) {
        //代码设置识别全部链接类型
        tv.setAutoLinkMask(Linkify.ALL);
        //自己设置几个链接 ,随便弄
        StringBuilder sb = new StringBuilder();
        sb.append(TextUtils.concat("CSDN:blog.csdn.net/eyishion?viewmode=contents", "\n"));
        sb.append(TextUtils.concat("邮箱:346419807@qq.com", "\n"));
        sb.append(TextUtils.concat("手机号码:10086"));
        tv.setText(sb);
        //设置这个点击会有效果 ,TextView设置这个下面tv.getText()不会报异常!EditText无所谓
        tv.setMovementMethod(LinkMovementMethod.getInstance());
        Spannable span = (Spannable) tv.getText();
        int end = span.length();
        //借助Spannable来获取URLSpan数组然后可以通过遍历获取所有的url地址
        URLSpan[] urlSpans = span.getSpans(0, end, URLSpan.class);
        if (urlSpans == null || urlSpans.length == 0) {
            return;
        }
        //此处使用这个可以设置文本的效果(这里我们自定义点击跳转效果)
        //我们使用了可变文本的SpannableStringBuilder
        SpannableStringBuilder ssb = new SpannableStringBuilder(span);
        //这里遍历获取地址
        for (URLSpan urlSpan : urlSpans) {
            String url = urlSpan.getURL();
            if (url.startsWith("http://")) {//Http替换
                ssb.replace(ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), "liverpool");
                //设置自定义的点击效果
                CustomURLSpan custom = new CustomURLSpan(url);
                ssb.setSpan(custom, ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (url.startsWith("mailto:")) {//email替换
                ssb.replace(ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), "邮箱");
                CustomURLSpan custom = new CustomURLSpan(url);
                ssb.setSpan(custom, ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (url.startsWith("tel:")) {//tel替换
                ssb.replace(ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), "电话号码");
                CustomURLSpan custom = new CustomURLSpan(url);
                ssb.setSpan(custom, ssb.getSpanStart(urlSpan), ssb.getSpanEnd(urlSpan), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        tv.setText(ssb);
        //setHighlightColor(int color)用于设置选中文字背景色高亮显示,这里设置为透明
        tv.setHighlightColor(getResources().getColor(android.R.color.transparent));
    }

    /**
     * 自定义ClickableSpan
     */
    public class CustomURLSpan extends ClickableSpan {
        public String url;

        public CustomURLSpan(String url) {
            this.url = url;
        }

        @Override
        public void onClick(View widget) {
            //这里实现自己想要的点击效果
            Toast.makeText(SpannableUrlLinkActivity.this, url, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setUnderlineText(false);
            ds.setColor(Color.GREEN);
        }
    }

顺便学习了一下SpannableStringBuilder的用法:

    /**
     * SpannableStringBuilder基本使用
     */
    private void setText(TextView tv) {

        SpannableStringBuilder ssb = new SpannableStringBuilder();
        /**设置背景色 BackgroundColorSpan*/
        String s1 = "足协新政向左,亚冠前景向淡\n";
        ssb.append(s1);
        BackgroundColorSpan bgColorSpan = new BackgroundColorSpan(Color.parseColor("#f0660e"));
        ssb.setSpan(bgColorSpan, ssb.length() - s1.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        /**设置前景色 ForegroundColorSpan*/
        String s2 = "龙骑兵”怎么啦?\n";
        ssb.append(s2);
        ForegroundColorSpan fgColorSpan = new ForegroundColorSpan(Color.parseColor("#0f660f"));
        ssb.setSpan(fgColorSpan, ssb.length() - s2.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        /**设置删除线效果 StrikethroughSpan*/
        String s3 = "亚冠高开,中超继续高走?\n";
        ssb.append(s3);
        StrikethroughSpan strikeSpan = new StrikethroughSpan();
        ssb.setSpan(strikeSpan, ssb.length() - s3.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        /**设置下划线效果 UnderlineSpan*/
        String s4 = "中超首秀,足协新政雷倒了谁?\n";
        ssb.append(s4);
        UnderlineSpan ulSpan = new UnderlineSpan();
        ssb.setSpan(ulSpan, ssb.length() - s4.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        /**设置粗体、斜体效果 StyleSpan*/
        String s5 = "亚冠抗日在即,恒苏须猛醒\n";
        ssb.append(s5);
        StyleSpan styleSpan = new StyleSpan(Typeface.BOLD_ITALIC);
        ssb.setSpan(styleSpan, ssb.length() - s5.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        /**设置字体、大小、样式、颜色 TextAppearanceSpan*/
        String s6 = "一战正名,上港比肩2013版恒大?\n";
        ssb.append(s6);
        TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(this, android.R.style.TextAppearance);
        ssb.setSpan(textAppearanceSpan, ssb.length() - s6.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        /**文本替换成图片 ImageSpan*/
        String s7 = "保卫长沙?-从长沙开始进攻!\n";
        ssb.append(s7);
        ImageSpan is1 = new ImageSpan(this, R.mipmap.emoji_1);
        ImageSpan is2 = new ImageSpan(this, R.mipmap.emoji_2);
        ImageSpan is3 = new ImageSpan(this, R.mipmap.emoji_3);
        //替换 ?
        ssb.setSpan(is1, ssb.length() - s7.length() + 4, ssb.length() - s7.length() + 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //替换 -
        ssb.setSpan(is2, ssb.length() - s7.length() + 5, ssb.length() - s7.length() + 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //替换 !
        ssb.setSpan(is3, ssb.length() - 2, ssb.length() - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        /**使用超链接标记文本 URLSpan*/
        String s8 = "里皮,将神奇进行到德黑兰";
        ssb.append(s8);
        URLSpan urlSpan = new URLSpan("http://blog.csdn.net/eyishion?viewmode=contents")
        {
            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setColor(ds.linkColor);
                ds.setUnderlineText(false);
            }
        };
        ssb.setSpan(urlSpan, ssb.length() - s8.length(), ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv.setText(ssb);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值