栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Android】textview识别并展示网址路径,可点击跳转打开链接

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Android】textview识别并展示网址路径,可点击跳转打开链接

///textview识别并展示网址链接,并可点击进行跳转
public class SpanUtils {

    private Context mContext;
    private static volatile SpanUtils uniqueInstance;
    public SpanUtils(Context mContext) {
        this.mContext = mContext;
    }
    //采用Double CheckLock(DCL)实现单例
    public static SpanUtils getInstance(Context context) {
        if (uniqueInstance == null) {
            synchronized (LocationUtils.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new SpanUtils(context);
                }
            }
        }
        return uniqueInstance;
    }
    
    public void interceptHyperlink(TextView tv) {
        tv.setMovementMethod(linkMovementMethod.getInstance());
        CharSequence text = tv.getText();
        SpannableStringBuilder stringBuilder=identifyUrl(text);
        tv.setText(stringBuilder);
    }
    linkedList mStringList = new linkedList();
    linkedList mUrlInfos = new linkedList();
    private String pattern =
            "((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\&%_\./-~-]*)?|(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\&%_\./-~-]*)?";

    Pattern r = Pattern.compile(pattern);
    Matcher m;
    int flag= Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;

    class UrlInfo {
        public int start;
        public int end;
    }


    public SpannableStringBuilder identifyUrl(CharSequence text) {
        mStringList.clear();
        mUrlInfos.clear();

        CharSequence contextText;
        CharSequence clickText;
        text = text == null ? "" : text;
        contextText = text;
        clickText = null;
        m = r.matcher(contextText);
        //匹配成功
        while (m.find()) {
            //得到网址数
            UrlInfo info = new UrlInfo();
            info.start = m.start();
            info.end = m.end();
            mStringList.add(m.group());
            mUrlInfos.add(info);
        }
        return joinText(clickText, contextText);
    }

    
    private SpannableStringBuilder joinText(CharSequence clickSpanText,
                                                      CharSequence contentText) {
        SpannableStringBuilder spanBuilder;
        if (clickSpanText != null) {
            spanBuilder = new SpannableStringBuilder(clickSpanText);
        } else {
            spanBuilder = new SpannableStringBuilder();
        }
        if (mStringList.size() > 0) {
            //只有一个网址
            if (mStringList.size() == 1) {
                String preStr = contentText.toString().substring(0, mUrlInfos.get(0).start);
                spanBuilder.append(preStr);
                String url = mStringList.get(0);
                CustomUrlSpan customUrlSpan = new CustomUrlSpan(mContext,url);
                int start = spanBuilder.length();
                spanBuilder.append(url, new UnderlineSpan(), flag);
                int end = spanBuilder.length();
                if (start >= 0 && end > 0 && end > start) {
                    spanBuilder.setSpan(customUrlSpan, start, end, flag);
                }
                String nextStr = contentText.toString().substring(mUrlInfos.get(0).end);
                spanBuilder.append(nextStr);
            } else {
                //有多个网址
                for (int i = 0; i < mStringList.size(); i++) {
                    String url = mStringList.get(i);
                    CustomUrlSpan customUrlSpan = new CustomUrlSpan(mContext,url);
                    if (i == 0) {
                        //拼接第1个span的前面文本
                        String headStr =
                                contentText.toString().substring(0, mUrlInfos.get(0).start);
                        spanBuilder.append(headStr);
                    }
                    if (i == mStringList.size() - 1) {
                        //拼接最后一个span的后面的文本
                        int start = spanBuilder.length();
                        spanBuilder.append(mStringList.get(i), new UnderlineSpan(), flag);
                        int end = spanBuilder.length();
                        if (start >= 0 && end > 0 && end > start) {
                            spanBuilder.setSpan(customUrlSpan, start, end, flag);
                        }
                        String footStr = contentText.toString().substring(mUrlInfos.get(i).end);
                        spanBuilder.append(footStr);
                    }
                    if (i != mStringList.size() - 1) {
                        //拼接两两span之间的文本
                        int start = spanBuilder.length();
                        spanBuilder.append(mStringList.get(i), new UnderlineSpan(), flag);
                        int end = spanBuilder.length();
                        if (start >= 0 && end > 0 && end > start) {
                            spanBuilder.setSpan(customUrlSpan, start, end, flag);
                        }
                        String betweenStr = contentText.toString()
                                .substring(mUrlInfos.get(i).end,
                                        mUrlInfos.get(i + 1).start);
                        spanBuilder.append(betweenStr);
                    }
                }
            }
        } else {
            spanBuilder.append(contentText);
        }
        return spanBuilder;
    }

}
///文本框点击超链接功能
public class CustomUrlSpan extends ClickableSpan {

    private Context context;
    private String url;
    public CustomUrlSpan(Context context,String url){
        this.context = context;
        this.url = url;

    }

    @Override
    public void onClick(View widget) {
        // 在这里可以做任何自己想要的处理
        BrowserActivity.start(context, url);
    }
}

参考地址https://www.cnblogs.com/wangqiong/p/10756752.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759968.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号