我有一个显示一些 HTML 代码(包括图像,ImageGetter)的 TextView。html 不是我的,但我可以要求他们包含自定义方案链接,甚至可能是标签。
目的:显示一些动态生成的内容,而无需使用嵌套的 Android 布局。
问题:必须在应用程序中处理某些链接(加载了新的 Fragment)。
不能为 action.VIEW 使用接收器,因为它是一个 Activity Intent,而不是广播,并且它的使用将是非常上下文相关的,因此只有以编程方式注册的接收器才可以。
我正在使用textView.setText(Html.fromHtml(content.content, imageGetter, null)
. 需要一切都保持不变,除了一些跨度应该有我自己onClick
的。我对 Spanned 不是很熟悉,所以我看到了这些选项:
- 编辑从返回的 SpannableStringBuilder
Html.fromHtml
,并用自定义 ClickableSpan 替换我想要的 URLSpan(如何?) - 如上所述,但将所有内容复制到新的构建器,将 URLSpan 交换为我自己的(如何?
append
只需要一个 CharSequence,我得到 RelativeSizeSpan、StyleSpan、ImageSpan、URLSpan ......) - 手动创建一个 Spaned。我可以为自定义方案做到这一点,但是如何复制
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
}
}));