使用Linkify.addLinks与Html.fromHtml结合使用

wna*_*fee 9 html java android linkify

我有一个TextView通过调用它得到它的数据集:

tv.setText(Html.fromHtml(myText));
Run Code Online (Sandbox Code Playgroud)

该字符串myText包含部分格式化的html数据.例如,它可能有字体标记,但没有使用<a href=...>标记格式化的任何url链接.我希望使用Linkify.addLinks(...)这样做,因为我的文本可能包含Linkify将为我适当转换的其他类型的链接.所以我写了我的代码看起来像这样:

String myText = "<font color=\"red\">Red text</font> and Url: www.google.com";
tv.setText(Html.fromHtml(myText));
Linkify.addLinks(tv, Linkify.ALL);
tv.setMovementMethod(LinkMovementMethod.getInstance());
Run Code Online (Sandbox Code Playgroud)

这不能正常工作.这意味着它处理字体标记但Linkify不会UrlSpan正确转换网址.

或者,如果我在没有Html.fromHtml(..)的情况下调用setText(),Linkify可以工作,但是我会丢失所有从html字体标签格式化的文本.不知怎的,他们似乎都是冲突的,我只能有一个或另一个.

现在这是我不理解的有趣部分.如果我从java中删除Linkify代码并转到我的布局xml并在其中放置以下行,所有似乎都在工作(Linkify和fromHtml最终一起玩得很好......不知何故)

<TextView
    ... 
    android:autoLink="all"
    android:linksClickable="true"
    ...
/>
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么会让一切正常吗?

我查看了TextView的源代码,setMovementMethod()最终调用:

setFocusable(true);
setClickable(true);
setLongClickable(true);
Run Code Online (Sandbox Code Playgroud)

理论上,这应该使一切工作和行为与xml布局代码相同.我尝试在java代码中切换Linkify.addLinks(..)之前调用的顺序setText(Html.fromHtml(..)),但这并没有什么区别.

关于为什么在java中组合Linkify.addLinks()和Html.fromHtml()的任何想法会导致这种行为......但不是在xml布局中?

gma*_*zzo 17

这是因为Html.fromHtml并且Linkify.addLinks在处理文本之前删除了先前的跨度.

使用此代码使其工作:

public static Spannable linkifyHtml(String html, int linkifyMask) {
    Spanned text = Html.fromHtml(html);
    URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);

    SpannableString buffer = new SpannableString(text);
    Linkify.addLinks(buffer, linkifyMask);

    for (URLSpan span : currentSpans) {
        int end = text.getSpanEnd(span);
        int start = text.getSpanStart(span);
        buffer.setSpan(span, start, end, 0);
    }
    return buffer;
}
Run Code Online (Sandbox Code Playgroud)

  • 并且不要忘记添加 `textView.setMovementMethod(LinkMovementMethod.getInstance());` (2认同)