<Excerpt in index | 首页摘要>
Android TextView分析Url高亮显示并相应点击事件
<The rest of contents | 余下全文>
项目中需要对TextView的超链接响应点击跳转.
这个相对简单,因为android原生textview就是支持的
这个属性叫做autoLink,可选有:all|web|email|phone等..
我们只需要响应超链接 直接填写web即可.
接下来你点击在TextView中的超链接,系统会自动调用打开浏览器,浏览你点击的网页.
但是因为我们项目Web浏览是自己做的,没有使用浏览器.所以需要截获这个点击事件,并传递至我们自己的WebActivity。
截获事件代码如下:
继承自TextView,然后粘如如下代码:
然后使用的时候,使用setTextByUrl()替代setText()即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| public void setTextByUrl(String text) { content.setText(text); SetLinkClickIntercept(this); }
private void SetLinkClickIntercept(TextView textView) {
textView.setMovementMethod(LinkMovementMethod.getInstance()); CharSequence text = textView.getText(); if (text instanceof Spannable) { int end = text.length(); Spannable sp = (Spannable) textView.getText(); URLSpan[] urls = sp.getSpans(0, end, URLSpan.class); if (urls.length == 0) { return; }
SpannableStringBuilder spannable = new SpannableStringBuilder(text); LinkedList<String> myurls = new LinkedList<String>(); for (URLSpan uri : urls) { String uriString = uri.getURL(); if (uriString.indexOf("http://") == 0 || uriString.indexOf("https://") == 0) { myurls.add(uriString); } } for (URLSpan uri : urls) { String uriString = uri.getURL(); if (uriString.indexOf("http://") == 0 || uriString.indexOf("https://") == 0) { MyURLSpan myURLSpan = new MyURLSpan(uriString, myurls); spannable.setSpan(myURLSpan, sp.getSpanStart(uri), sp.getSpanEnd(uri), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); } } textView.setText(spannable); } }
private class MyURLSpan extends ClickableSpan { private String mUrl; private LinkedList<String> mUrls;
MyURLSpan(String url, LinkedList<String> urls) { mUrl = url; mUrls = urls; }
@Override public void updateDrawState(TextPaint ds) { ds.setColor(ds.linkColor); ds.setUnderlineText(false); ds.setColor(getResources().getColor(R.color.green));
}
@Override public void onClick(View widget) { WebActivity.startActivity(MyApp.getInstance(), mUrl); } }
|