【问题标题】:How to make all 3 types of links in textview如何在 textview 中创建所有 3 种类型的链接
【发布时间】:2016-09-25 03:32:23
【问题描述】:

我想让 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>"

如果我对 html 文本使用 MovementMethod,则只有第二个和第三个链接是可点击的。 如果我使用 Linkify(或混合使用),则只有第一个和第二个链接是可点击的。

我怎样才能让它们都可以点击?

【问题讨论】:

    标签: android textview


    【解决方案1】:

    经过调查,我发现 Linkify.addLinks() 方法从文本中删除当前跨度并应用新的一次(基于例如网页 url)。因此,我从 Html.fromHtml() 的跨度在开始时被删除,并且再也不会应用。

    所以我做了以下操作:
    1. 从 htmml Html.fromHtml 中读取 xt,这给了我 Spanned obj with html spans。
    2. 将 html 中的 span 保存到数组中
    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;
            }
        }
    

    【讨论】:

    【解决方案2】:

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

    "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>"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-04
      • 2011-04-18
      • 2013-02-12
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      相关资源
      最近更新 更多