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