我有带有自动链接的文本视图,但是每当我将自定义跨度(可单击跨度)添加到文本视图时,其自动链接到网络网址和手机号码都不起作用。 有没有简单的方法可以解决这个问题。应用了样式,但单击不起作用。
https://stackoverflow.com/a/39494610/4639479 我使用了这个答案并且工作正常
public static String[] extractLinks(String text) {
List<String> links = new ArrayList<String>();
Matcher m = Patterns.WEB_URL.matcher(text);
while (m.find()) {
String url = m.group();
links.add(url);
}
return links.toArray(new String[links.size()]);
}
这是因为 Html.fromHtml 和 Linkify.addLinks 在处理文本之前会删除以前的跨度。
使用此代码使其正常工作:
public static Spannable linkifyHtml(String html, int linkifyMask) {
Spanned text = Html.fromHtml(html);
URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);
SpannableString buffer = new SpannableString(text);
Linkify.addLinks(buffer, linkifyMask);
for (URLSpan span : currentSpans) {
int end = text.getSpanEnd(span);
int start = text.getSpanStart(span);
buffer.setSpan(span, start, end, 0);
}
return buffer;
}
更新了 Html.fromHtml(html) 弃用的先前答案,并添加了对 URL 中方案前缀(如果不存在)的检查(现在,当定位到 Android 12 时,如果网址没有以方案为前缀,则会导致"找不到意图的活动"错误消息):
public static Spannable linkifyHtml(String html, int linkifyMask) {
Spanned text = HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);
SpannableString buffer = new SpannableString(text);
Linkify.addLinks(buffer, linkifyMask);
if (currentSpans.length > 0) {
// fix URLs of any links which don't have a scheme
URLSpan[] fixedSpans = new URLSpan[currentSpans.length];
for (int i = 0; i < currentSpans.length; i++) {
if (!currentSpans[i].getURL().contains("//:")) {
URLSpan fixed = new URLSpan("http://" + currentSpans[i].getURL());
log.debug("Fixed URL: " + currentSpans[i].getURL() + " --> " + fixed.getURL());
fixedSpans[i] = fixed;
} else {
fixedSpans[i] = currentSpans[i];
}
}
for (int i = 0; i < currentSpans.length; i++) {
int end = text.getSpanEnd(currentSpans[i]);
int start = text.getSpanStart(currentSpans[i]);
buffer.setSpan(fixedSpans[i], start, end, 0);
}
}
return buffer;
}
}
这对我既适用于一个裸露的"www.foo.com"URL 和一个作为锚链接的 URL,在同一个 HTML 中,获取此方法的结果并将其设置为 android:linksClickable="true" 的 TextView 并在代码中设置 setMovementMethod(LinkMovementMethod.getInstance());。