我正在尝试在TextViews中处理HTML和键入的链接,但我无法找到内置工具的组合来执行此操作。我可以做一个或另一个工作,但不能两个。
给出以下格式
http://google.com
<a href="http://google.com/">Google!</a>
使用.setMovementMethod(LinkMovementMethod.getInstance())我可以将锚标记转换为链接并在点击时打开网页。使用.setAutoLinkMask(Linkify.ALL)我可以使键入的链接按预期工作。问题是setAutoLinkMask禁用了setMovementMethod功能,并删除了它在html链接上创建的突出显示以及它的点击功能。
我尝试用这个问题搜索其他人,我相信我因为这种情况缺乏适当的条款而被阻止。还有其他人遇到过无缝处理这两种情况的解决方案吗?
这就是我目前所拥有的,只有在TextView中链接了键入的链接,锚点只显示它包装的文本。
mTextViewBio.setText(Html.fromHtml(htmlstring));
mTextViewBio.setAutoLinkMask(Linkify.ALL);
mTextViewBio.setMovementMethod(LinkMovementMethod.getInstance());
mTextViewBio.setLinksClickable(true);
TextView输出:
答案 0 :(得分:3)
问题是,当首先调用Linify.addLinks()
时,此方法的作用是删除所有跨度。当您使用Html.fromHtml()
Spanned
时返回,因此当Linkify
再次解析文本时,首先删除“html链接”。我写了一个简单的课LinkifyExtra
。它有一个额外的方法
public class LinkifyExtra extends Linkify {
public static Spanned addLinksHtmlAware(String htmlString) {
// gather links from html
Spanned spann = Html.fromHtml(htmlString);
URLSpan[] old = spann.getSpans(0, spann.length(), URLSpan.class);
List<Pair<Integer, Integer>> htmlLinks = new ArrayList<Pair<Integer, Integer>>();
for (URLSpan span : old) {
htmlLinks.add(new Pair<Integer, Integer>(spann.getSpanStart(span),
spann.getSpanEnd(span)));
}
// linkify spanned, html link will be lost
Linkify.addLinks((Spannable) spann, Linkify.ALL);
// add html links back
for (int i = 0; i < old.length; i++) {
((Spannable) spann).setSpan(old[i], htmlLinks.get(i).first,
htmlLinks.get(i).second, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spann;
}
}
并像那样使用
String htmlstring = "http://google.com <a href=\"http://google.com/\">Google!</a>";
textView = (TextView)findViewById(R.id.textView1);
textView.setText(LinkifyExtra.addLinksHtmlAware(htmlstring));
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setLinksClickable(true);
它有效。但是您无法使用mTextViewBio.setAutoLinkMask(Linkify.ALL);
,因为它会触发addLinks()
并删除“html链接”。取决于您想要在更大的图片中做什么,这种方法可能需要一些改变。我跳过检查跨距是否重叠,因为我认为它不会发生,但如果我错了,你可以简单地复制this方法。