2013-02-18 87 views
1

我想在TextViews中处理HTML和类型链接,并且无法找到内置工具的组合来执行此操作。我可以做一个或其他的工作,但不能两个。Android在TextView中处理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
谷歌!

回答

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

+0

令人失望的是,这不是Android的一部分;然而,你的班级看起来有诀窍。如果有的话,它会让我走向正确的方向。谢谢。 – 2013-02-18 22:40:24