2

我正在尝试在 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);

文本视图输出:

http://google.com
谷歌!

4

1 回答 1

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 链接”。取决于您想在更大的范围内做什么,此方法可能需要进行一些更改。我跳过检查跨度是否重叠,因为我认为它不会发生,但如果我错了,你可以简单地复制这个方法。

于 2013-02-18T22:28:25.250 回答