将文本中的带超链接的a标签的文本进行解析并设置跳转:
public static void addHyperLinkForText(TextView textView, String text, final Context context) {
if(TextUtils.isEmpty(text)) {
textView.setText("");
}
Pattern pattern = Pattern.compile("(<a.*?</a>)");
Matcher matcher = pattern.matcher(text);
int matcher_start = 0;
int lastEnd = 0;
//key为超链接文本的开始,结束位置,value为链接地址
Map<int[], String> points = new HashMap<>();
while (matcher.find(matcher_start)) {
String hyperlink = matcher.group(1);
if (hyperlink != null) {
Pattern linkPattern = Pattern.compile("(?<=href=\")(.+?)(?=\")");
Pattern contentPattern = Pattern.compile("(?<=\\>)(.*)(?=\\<)");
Matcher linkMatcher = linkPattern.matcher(hyperlink);
Matcher contentMatcher = contentPattern.matcher(hyperlink);
if (linkMatcher.find() && contentMatcher.find()) {
String link = linkMatcher.group();
String content = contentMatcher.group();
text = text.replace(hyperlink, content);
int start = text.indexOf(content, lastEnd);
lastEnd = start + content.length();
int[] position = new int[]{start, lastEnd};
points.put(position, link);
}
matcher_start = matcher.end();
}
}
if (points.size() == 0) {
textView.setText(text);
return;
}
SpannableStringBuilder builder = new SpannableStringBuilder(text);
Set<Map.Entry<int[], String>> entries = points.entrySet();
for (Map.Entry<int[], String> entry : entries) {
int[] position = entry.getKey();
int start = position[0];
int end = position[1];
final String link_address = entry.getValue();
builder.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
WebActivity.startSelf(context, link_address);
}
}, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(builder);
}
demo地址:https://download.csdn.net/download/weixin_45253393/13093995