Android在TextView中处理HTML链接和键入的链接

时间:2013-02-18 19:54:58

标签: android

我正在尝试在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输出:

http://google.com
谷歌!

1 个答案:

答案 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方法。