如何在textview中制作所有3种类型的链接

时间:2016-09-23 15:07:38

标签: android textview

我想让textview中的所有链接都可以点击。

示例文本为:

"All three should link out http://google.com  and <a href="http://google.com">here link</a> and <a href="http://google.com">http://google.com</a>"

如果我将MovementMethod与html文本一起使用,则只能点击第二个和第三个链接。 如果我使用Linkify(或混合使用),则只能点击第一个和第二个链接。

如何让所有这些都可以点击?

2 个答案:

答案 0 :(得分:1)

在invesigation之后,我发现Linkify.addLinks()方法从文本中删除当前跨度并应用新的一次(基于例如网页URL)。因为我从Html.fromHtml()的跨度在开始时被删除,再也没有再次应用。

所以我做了以下事项:
1.从htmml Html.fromHtml中读取文本,它给我带有html跨度的跨越obj 2.从数组中的html保存跨度
3.制作linkify.addLinks - 这个方法删除我的旧跨度,所以我将不得不将其添加回来 4.添加旧跨度
5.将文本设置为textview。

实现:

private void setLabel(){    
    label.setText(linkifyHTML(Html.fromHtml("text with links here"));
    label.setMovementMethod(LinkMovementMethod.getInstance());
    label.setLinkTextColor(getRes().getColor(R.color.link));
}
    private Spannable linkifyHTML(CharSequence text) {
        Spannable s = new SpannableString(text);

        URLSpan[] old = s.getSpans(0, s.length(), URLSpan.class);
        LinkSpec oldLinks[] = new LinkSpec[old.length];

        for (int i = 0; i < old.length; i++) {
            oldLinks[i] = new LinkSpec(old[i], s.getSpanStart(old[i]), s.getSpanEnd(old[i]));
        }

       Linkify.addLinks(s, Linkify.ALL);
       for (LinkSpec span : oldLinks) {
           s.setSpan(span.span, span.start, span.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
       }
       return s;
    }

    class LinkSpec {
        final URLSpan span;
        final int start, end;

        public LinkSpec(URLSpan urlSpan, int spanStart, int spanEnd) {
            span = urlSpan;
            start = spanStart;
            end = spanEnd;
        }
    }

答案 1 :(得分:0)

您必须使用反斜杠\来搜索"字符,这样字符串就不会将其视为字符串的最后一点。我的意思是,当所有文本都在两个""内时,会考虑一个字符串。您必须在网址中搜索"个字符,因为如果不是,字符串会认为它必须在找到新的"字符时结束,在这种情况下会在您的网址中。

"All three should link out http://google.com  and <a href=\"http://google.com\">here link</a> and <a href=\"http://google.com\">http://google.com</a>"