我有一个TextView,它显示一些HTML代码(包括图像,ImageGetter).
html不是我的,但是我可以要求他们包括自定义方案链接,甚至标签.
目的:显示一些动态生成的内容,而无需使用嵌套的Android布局.
问题:某些链接必须在应用程序中处理(装入新片段).
不能使用receiver for action.VIEW,因为它是一个活动意图,而不是广播,并且它的使用将具有很大的上下文关系,因此只有以编程方式注册的接收者才能使用.
我正在使用textView.setText(Html.fromHtml(content.content,imageGetter,null).需要所有内容保持不变,除了某些跨度应该有我自己的onClick.我对Spanned不太熟悉,所以我知道这些选项:
>编辑从Html.fromHtml返回的SpannableStringBuilder,并用自定义的ClickableSpan替换我想要的URLSpans(如何?)
>如上所述,但是将所有内容复制到新的构建器中,将URLSpans替换为我自己的(怎么办?append仅采用CharSequence,而我得到RelativeSizeSpan,StyleSpan,ImageSpan,URLSpan …)
>手动创建Spanned.我可以针对自定义方案执行此操作,但是如何为其他所有操作复制Html.fromHtml的效果(或足够接近)?
[编辑]
感谢MH.有关信息.我之前曾尝试过,但是失败了.现在我返回到它,我发现我犯了一个错误,将错误的项目传递给setSpan的第一个参数.
如果有人感兴趣,我现在使用它:
public static interface OnSpanClickListener {
void onClick(String url);
}
public static SpannableStringBuilder getSpannable(String source, ImageGetter imageGetter, String scheme, final OnSpanClickListener clickHandler){
SpannableStringBuilder b = (SpannableStringBuilder) Html.fromHtml(source, imageGetter, null);
for(URLSpan s : b.getSpans(0, b.length(), URLSpan.class)){
String s_url = s.getURL();
if(s_url.startsWith(scheme+"://")){
URLSpan newSpan = new URLSpan(s_url.substring(scheme.length()+3)){
public void onClick(View view) {
clickHandler.onClick(getURL());
}
};
b.setSpan(newSpan, b.getSpanStart(s), b.getSpanEnd(s), b.getSpanFlags(s));
b.removeSpan(s);
}
}
return b;
}
(…)
body.setText(getSpannable(content.content, imageGetter, getResources().getString(R.string.poster_scheme), new OnSpanClickListener(){
public void onClick(String url) {
// do whatever
}
}));