android中实现文字的超链接的应用内跳转

来源:互联网 发布:王权富贵东方月初乐乎 编辑:程序博客网 时间:2024/06/06 12:29


实现像新浪微博那样的文字中有蓝色超链接,点击后跳转到应用里面的指定页面。


首先自定义一个touchListerner:


/** * Created by App-Dev on 2015/10/20. * 识别超链接的touchListener */public class FindUrlTouchListener implements View.OnTouchListener {    @Override    public boolean onTouch(View v, MotionEvent event) {        boolean ret = false;        TextView textView = (TextView) v;        CharSequence text = textView.getText();        Spannable sText = Spannable.Factory.getInstance().newSpannable(text);        int action = event.getAction();        //超链接的识别        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {            int x = (int) event.getX();            int y = (int) event.getY();            x -= textView.getTotalPaddingLeft();            y -= textView.getTotalPaddingTop();            x += textView.getScrollX();            y += textView.getScrollY();            Layout layout = textView.getLayout();            if (layout != null) {                int line = layout.getLineForVertical(y);                int off = layout.getOffsetForHorizontal(line, x);                ClickableSpan[] link = sText.getSpans(off, off, ClickableSpan.class);                if (link.length != 0) {                    //添加按压后的背景颜色                    if (action == MotionEvent.ACTION_DOWN) {                        Spanned sp = (Spanned) text;                        int st = sp.getSpanStart(link[0]);                        int en = sp.getSpanEnd(link[0]);                        sText.setSpan(new BackgroundColorSpan(v.getResources().getColor(R.color.linkBg)), st, en, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);                        textView.setText(sText);                    }                    if (action == MotionEvent.ACTION_UP) {                        //清除按压后的背景颜色                        BackgroundColorSpan[] bcs = sText.getSpans(off, off, BackgroundColorSpan.class);                        if (bcs.length != 0) {                            sText.removeSpan(bcs[0]);                            textView.setText(sText);                        }                        //处理超链接                        URLSpan[] urls = sText.getSpans(off, off, URLSpan.class);                        //获取超链接网址                       String url = urls[0].getURL();                        if ((url.contains("匹配条件")) {                            /**                             * 通过url打开对应的应用页面                             */                        } else {                            //超链接为空                            if (!TextUtils.isEmpty(url)) {                                try {                                    link[0].onClick(v);                                } catch (Exception e) {                                    e.printStackTrace();                                }                            }                        }                    }                    ret = true;                }            }        }        //清除按压后的背景颜色        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {            BackgroundColorSpan[] bcs = sText.getSpans(0, text.length(), BackgroundColorSpan.class);            if (bcs.length != 0) {                sText.removeSpan(bcs[0]);                textView.setText(sText);            }        }        return ret;    }}


然后textView设置OnTouchListener:


textView.setOnTouchListener(new FindUrlTouchListener());


最后只需要将包含超链接的文本设置到textView中(注意使用:Html.from(str);):


textView.setText(Html.from(str));


默认情况下textView中的超链接会有下划线。通过下面的方法可以去除:

 //去掉链接的下划线    private static void setHtmlStyle(TextView textView) {        Spannable s = new Spannable.Factory().newSpannable(textView.getText());        URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);        for (URLSpan span : spans) {            int start = s.getSpanStart(span);            int end = s.getSpanEnd(span);            s.removeSpan(span);            span = new URLSpanNoUnderline(span.getURL());            s.setSpan(span, start, end, 0);        }        textView.setText(s);    }    private static class URLSpanNoUnderline extends URLSpan {        public URLSpanNoUnderline(String url) {            super(url);        }        @Override        public void updateDrawState(TextPaint ds) {            super.updateDrawState(ds);            ds.setUnderlineText(false);        }        @Override        public void onClick(View widget) {            super.onClick(widget);        }    }




1 0
原创粉丝点击