美文网首页
textview识别链接并区分颜色显示

textview识别链接并区分颜色显示

作者: sexyhair | 来源:发表于2018-07-27 15:41 被阅读0次

方式 一 :使用textview 自带属性

android:autoLink="web"
此方式设置的效果 如下图

注意:点击链接会直接打开手机中的浏览器打开链接且颜色更改不了

方式 二 :使用SpannableString

URL的匹配可以有2种:Linkify.addLinks(sp, Linkify.WEB_URLS)和正则表达式;

经验证:正则效果要好些

第一种经验证匹配的不是很准确,代码如下

private void setContentHttp(String str){
    SpannableString sp = new SpannableString(str);
    Linkify.addLinks(sp, Linkify.WEB_URLS);
    URLSpan[] spans = sp.getSpans(0, str.length(), URLSpan.class);
    if(spans != null && spans.length > 0){
        for(int i = 0; i < spans.length ; i++){
            final String url = spans[i].getURL();
            sp.setSpan(new ForegroundColorSpan(Color.BLUE), sp.getSpanStart(spans[i]), sp.getSpanEnd(spans[i]), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            sp.setSpan(new UnderlineSpan(), sp.getSpanStart(spans[i]), sp.getSpanEnd(spans[i]),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            sp.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    ActivityAct.launchH5Activity(mContext, url, false, false, true);
                }

                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    ds.setColor(Color.BLUE);
                    ds.setUnderlineText(false);
                }
            },sp.getSpanStart(spans[i]), sp.getSpanEnd(spans[i]),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            sp.setSpan(new ViewUtils.Clickable(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    ActivityAct.launchH5Activity(mContext, url, false, false, true);
                }
            }),sp.getSpanStart(spans[i]), sp.getSpanEnd(spans[i]),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
    mActContent1.setText(sp);
    mActContent1.setMovementMethod(LinkMovementMethod.getInstance());
}

第二种正则表达式:

private void setContentHttpPattern(String string){
    SpannableString sp = new SpannableString(string);
    String urlPattern =
            "((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)";
    Pattern pattern = Pattern.compile(urlPattern, Pattern.CASE_INSENSITIVE);
    Matcher m = pattern.matcher(string);
    int startPoint = 0;
    while (m.find(startPoint)) {
        int endPoint = m.end();
        String hit = m.group();
        ClickableSpan clickSpan = new UrLClickSpan(hit);
        sp.setSpan(clickSpan, endPoint - hit.length(), endPoint, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//用Span替换对应长度的url
        startPoint = endPoint;
    }
    mActContent1.setText(sp);
    mActContent1.setMovementMethod(LinkMovementMethod.getInstance());
}

注意:
采用SpannableString方式时不要在xml配置android:autoLink属性
若是使链接具体可点击功能的话必须设置setMovementMethod方法

参考链接:
https://www.cnblogs.com/txlbupt/p/3465847.html
https://blog.csdn.net/gdutxiaoxu/article/details/77800756

相关文章

网友评论

      本文标题:textview识别链接并区分颜色显示

      本文链接:https://www.haomeiwen.com/subject/pkajmftx.html