解析带有超链和电话号码的字符串,并标记超链添加点击事件

来源:互联网 发布:java 代码混淆 编辑:程序博客网 时间:2024/05/16 18:59

在做消息推送的时候,接口会返回一条带有超链的字符串,要求能够解析出里面的链接地址..以及手机号…并且蓝色字体,,下划线,,在点击链接地址时需要做自己的一些操作

废话不多说,,直接上代码:

public class SaHyperlinkStyleEditUtils {    private boolean isShowUnderLine = true;    private int color = -1;    //用来设置监听事件,单击链接做自己的操作    private OnLinkClickListener onLinkClickListener;    public void setColor(int color) {        this.color = color;    }    /**     * 下划线显隐     */    public void setIsShowUnderLine(boolean isShowUnderLine) {        this.isShowUnderLine = isShowUnderLine;    }    public void setUrl(TextView tv, String htmlLinkText, OnLinkClickListener onLinkClickListener) {        this.onLinkClickListener = onLinkClickListener;        //html 不识别\n 换行 所以得转换为<br>         htmlLinkText = htmlLinkText.replace("\n", "<br>");         // \t在与() 相遇是不识别,不知道什么鬼..所以加上空格替换,懂得可以说明下        htmlLinkText = htmlLinkText.replace("\t", " \t");        //string转化为html        tv.setText(Html.fromHtml(htmlLinkText));  //这句不加上不会生效       tv.setMovementMethod(LinkMovementMethod.getInstance());        CharSequence text = tv.getText();        if (text instanceof Spannable) {            int end = text.length();            Spannable sp = (Spannable) tv.getText();            URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);            SpannableStringBuilder style = new SpannableStringBuilder(text);            style.clearSpans();// should clear old spans            for (URLSpan url : urls) {                MyURLSpan myURLSpan = new MyURLSpan(url.getURL());                style.setSpan(myURLSpan, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);            }            tv.setText(style);        }    }    private class MyURLSpan extends ClickableSpan {        private String mUrl;        MyURLSpan(String url) {            mUrl = url;        }        @Override        public void onClick(View widget) {            if (onLinkClickListener != null) {                onLinkClickListener.onLinkClickListener(widget, mUrl);            }        }        /**         * 修改样式         *         * @param ds         */        @Override        public void updateDrawState(TextPaint ds) {            if (color == -1) {                //默认色                ds.setColor(ds.linkColor);            } else {                //自定义样式                ds.setColor(color);            }            //下划线显示或隐藏 true 显示 false 隐藏            ds.setUnderlineText(isShowUnderLine);        }    }    /**     * 点击链接事件的监听     */    public interface OnLinkClickListener {        void onLinkClickListener(View view, String url);    }}
阅读全文
0 0
原创粉丝点击