Java 使用Linkify.addLinks与Html.fromHtml组合

Java 使用Linkify.addLinks与Html.fromHtml组合,java,android,html,linkify,Java,Android,Html,Linkify,我有一个TextView,它通过调用以下命令来获取数据集: tv.setText(Html.fromHtml(myText)); 字符串myText包含部分格式化的html数据。例如,它可能有字体标记,但没有使用标记格式化的url链接。我希望使用Linkify.addLinks(…)来实现这一点,因为我的文本可能包含Linkify可以适当转换的其他类型的链接。因此,我编写了如下代码: String myText = "<font color=\"red\">Red text<

我有一个
TextView
,它通过调用以下命令来获取数据集:

tv.setText(Html.fromHtml(myText));
字符串
myText
包含部分格式化的html数据。例如,它可能有字体标记,但没有使用
标记格式化的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());
有人能给我解释一下为什么这会让一切都正常运转吗

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

setFocusable(true);
setClickable(true);
setLongClickable(true);
从理论上讲,这将使一切工作起来,并表现出与xml布局代码相同的行为。在java代码中,我尝试在
setText(Html.fromHtml(…)
之前切换调用
Linkify.addLinks(…)
的顺序,但这并没有什么不同


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

这是因为
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;
}
你可以试试这个:

首先在文本视图中设置文本

tv.setText(myText);
使用Linkify转换链接

Linkify.addLinks(tv, Linkify.ALL);
最后将文本替换为Html.fromHtml,但使用EditText中的链接文本

tv.setText(Html.fromHtml(tv.getText().toString()));
100%工程解决方案(kotlin)

在Linkify之前为store HtmlLink创建类

class HtmlLink(val urlSpan: URLSpan, val spanStart: Int, val spanEnd: Int)
创建跨区html(两种测试格式)

恢复跨度

htmlLinks.forEach { htmlLink ->
    builder.setSpan(URLSpan(htmlLink.urlSpan.url), htmlLink.spanStart, htmlLink.spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
最后设置文本

scrollContent.text = builder

不要忘记添加
textView.setMovementMethod(LinkMovementMethod.getInstance())
如果您有一些
,它将导致一个指向
其他链接的可单击链接。您只需删除
[start,end]
中的所有
URLSpan
,然后将新span添加到缓冲区即可解决此问题,并获得指向
oneLink
的链接。我发现错误。。。需要创建新的URLSpan。张贴新answer@gmazzo答案很好,应该被接受:
val htmlLinks = ArrayList<HtmlLink>()
spanned.getSpans(0, spanned.length, URLSpan::class.java).forEach { urlSpan ->
    htmlLinks.add(HtmlLink(urlSpan, 
                  spanned.getSpanStart(urlSpan),
                  spanned.getSpanEnd(urlSpan)))
}
val builder = SpannableString(spanned)
Linkify.addLinks(builder, Linkify.WEB_URLS)
htmlLinks.forEach { htmlLink ->
    builder.setSpan(URLSpan(htmlLink.urlSpan.url), htmlLink.spanStart, htmlLink.spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
scrollContent.text = builder