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

来源:互联网 发布:ubuntu 14.04 jdk1.6 编辑:程序博客网 时间:2024/04/29 07:24

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

    /**     * 拦截超链接文本     */    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