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)