带锚和原始链接的TextView(SpannableString问题)

时间:2014-08-19 19:02:37

标签: android spannablestring

在我的textview中,我希望锚点和原始链接都是可点击的。我让TextView.setAutoLinkMask(Linkify.ALL)处理所有原始链接,然后检索跨度并使用SpannableString为所有锚点设置它们。

我希望能够联系'自定义TextView实现中的锚点(扩展TextView)在setText(CharSequence文本,BufferType类型)调用中。除了setSpan()调用之外,一切似乎都正常工作(结束,开始和跨度都是正确的)。在setText(...)的末尾,我将全局CharSequence var分配给新的SpannableString。从我的适配器调用setText()时,Object [] spans中标识的跨距不会链接。

@Override
public void setText(CharSequence text, BufferType type) {
    Spanned html = Html.fromHtml(text.toString().replace("\n", "<br />"));
    Object[] spans = html.getSpans(0, html.length(), URLSpan.class);
    SpannableString s = new SpannableString(html);
    for (int i = 0; i < spans.length; i++) {
        URLSpan span = (URLSpan) spans[i];
        int end = html.getSpanEnd(span);
        int start = html.getSpanStart(span);
        int flags = html.getSpanFlags(span);
        Log.i(LOG_TAG, "span: " + span.getURL() + "\nstart: " + start + "\nend: " + end);
        s.setSpan(span, start, end, flags);
    }
    mText = s;
}

我在下面列出的代码中找到了解决此问题的轻微解决方法。在此实现中,我在适配器中设置跨度而不是CustomTextView。这种方法工作正常,但并不完全符合我的需要,因为我的TextView用作ExpandableTextView,这意味着有两组文本(修剪和完整),并且经常返回修剪版本(这在典型的情况下很好)场景,除了我想在全文中添加标签)。此实现经常崩溃,因为最初识别的跨度是针对fullText,而getText()返回trimmedText。所以我认为在我的自定义TextView的setText()中能够做到这一点是必要的。但是,下面的方法确实可以使trimmedText和fullText具有相同的长度。

 Spanned html = Html.fromHtml(postText.replace("\n", "<br />"));
 Object[] spans = html.getSpans(0, html.length(), URLSpan.class);
 h.content.setAutoLinkMask(Linkify.ALL);
 h.content.setMovementMethod(LinkMovementMethod.getInstance());
 h.content.setText(html);
 h.content.setLinkTextColor(Color.rgb(136, 194, 226));
 h.content.setVisibility(View.VISIBLE); // Need this otherwise the view disappears....

 SpannableString ss = (SpannableString) h.content.getText();
 for (int i = 0; i < spans.length; i++) {
      URLSpan span = (URLSpan) spans[i];
      int end = html.getSpanEnd(span);
      int start = html.getSpanStart(span);
      int flags = html.getSpanFlags(span);
      ss.setSpan(span, start, end, flags);
  }

1 个答案:

答案 0 :(得分:0)

以下是我解决问题的方法:

就我的问题而言,我已经解析了内容并添加了锚点(点击时会启动活动的HTML链接)到我的标签(@和#)。我也想让raw(例如,www.google.com)可点击,所以我尝试将我的TextView设置为setAutoLinkMask(Linkify.ALL),但这打破了锚链接。

所以这就是我所做的:

    SpannableStringBuilder ssb = 
            new SpannableStringBuilder(Html.fromHtml
                    (this.content.replace("\n", "<br />")));
    Pattern urlPattern = android.util.Patterns.WEB_URL;
    Linkify.addLinks(ssb, urlPattern, "youractivityhere://");
    myTextView.setText(ssb);

基本上我正在使用正则表达式匹配器来查找字符串中的任何URL,然后使用Linkify.addLinks(...)添加链接。

我让问题变得比需要的更困难。