在开发项目中,遇到一个需求,需要做到微信那种,在文本中自定识别链接,然后点击打开内部自身实现的WebView。
参考了一些网上的案例,但发现都满足不了微信的那种效果,于是自己研究了下相关知识点,用了两种办法实现微信
的这种效果。 以下附上两种实现思路的代码,代码写的匆忙,如有大神发现优化之处,可提出。
方法一:
//利用正则识别
private CharSequence checkAutoLink(String content) {
String url = "百度 https://www.baidu.com/,腾讯 http://www.qq.com/,淘宝 www.taobao.com/";//此处测试,就不用参数了
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(url);
Pattern pattern = Pattern.compile("([\\s>])([\\w]+?://[\\w\\\\x80-\\\\xff\\#$%&~/.\\-;:=,?@\\[\\]+]*)");
Matcher matcher = pattern.matcher(spannableStringBuilder);
while (matcher.find()) {
setClickable(spannableStringBuilder, matcher);
}
Pattern pattern2 = Pattern.compile("([\\s>])((www|ftp)\\.[\\w\\\\x80-\\\\xff\\#$%&~/.\\-;:=,?@\\[\\]+]*)");
matcher.reset();
matcher = pattern2.matcher(spannableStringBuilder);
while (matcher.find()) {
setClickableSpan(spannableStringBuilder, matcher);
}
return spannableStringBuilder;
}
//给符合的设置自定义点击事件
private void setClickableSpan (final SpannableStringBuilder clickableHtmlBuilder, final Matcher matcher) {
int start = matcher.start();
int end = matcher.end();
final String url = matcher.group();
ClickableSpan clickableSpan = new ClickableSpan() {
public void onClick(View view) {
Intent intent = new Intent(context, WebViewActivity.class);
intent.putExtra("url", url);
startActivity(intent);
}
};
clickableHtmlBuilder.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
在TextView处不必设置autolink,只设置
setAutoLinkTextColor(getResources().getColor(R.color.link_color));//如保持系统风
setMovementMethod(LinkMovementMethod.getInstance()); 这两处即可。
方法二:
优化网上的一些实现方法,代码就不贴了,大概实现思路 :
网上很多Demo都是将文本html格式化,然后利用UrlSpan匹配出相应的结果,在相应的结果中做自定义点击事件处理
但在实际操作当中,很多文本没有html标签,UrlSpan匹配不出结果,所以应当先采用方法一利用正则匹配出相应结果,然后将结果替换带有html 超链接标签的字符串。
再将该整个文本html格式化。
个人建议使用方法一。