gpt4 book ai didi

android - 从 Html.fromHtml 跨越,但使用自定义方案的自定义 ClickableSpan

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:52 24 4
gpt4 key购买 nike

我有一个显示一些 HTML 代码的 TextView(包括图像,ImageGetter)。html 不是我的,但我可以要求他们包含自定义方案链接,甚至标签。

目的:显示一些动态生成的内容,而不需要玩嵌套的 Android 布局。
问题:某些链接必须在应用程序中处理(加载新的 fragment )。
不能使用 receiver for action.VIEW ,因为它是一个 Activity Intent,而不是一个广播,而且它的使用将是非常有上下文的,所以只有一个以编程方式注册的接收器才可以。

我正在使用textView.setText(Html.fromHtml(content.content, imageGetter, null)。需要一切保持不变,除了一些 Spanned 应该有我自己的onClick就可以了。我对 Spanned 不是很熟悉,所以我看到了这些选项:

  1. 编辑从 Html.fromHtml 返回的 SpannableStringBuilder,并用自定义 ClickableSpan 替换我想要的 URLSpans(怎么做?)
  2. 同上,但将所有内容复制到新构建器,将 URLSpans 换成我自己的(如何?append 仅采用 CharSequence,我得到 RelativeSizeSpan、StyleSpan、ImageSpan、URLSpan...)
  3. 手动创建 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
}
}));

最佳答案

选项 1 可能是最直接的,并且之前已经完成了大部分艰苦的工作。您的总体思路是正确的:处理完 HTML 后,您可以请求所有生成的 URLSpan 实例并循环遍历它们。然后,您可以将其替换为自定义的可点击 Spanned ,以完全控制任何 Spanned 点击。

在下面的示例中,我只是将每个 URLSpan 替换为该类的一个简单扩展,该类采用原始 url(实际上,我应该说“uri”)并替换其方案部分.我没有实现实际的 onClick() 逻辑,但我会将其留给您发挥想象力。

SpannableStringBuilder builder = ...
URLSpan[] spans = builder .getSpans(0, builder .length(), URLSpan.class);
for (URLSpan span : spans) {
int start = builder .getSpanStart(span);
int end = builder .getSpanEnd(span);
s.removeSpan(span);
span = new CustomURLSpan(span.getURL().replace("http://", "scheme://"));
s.setSpan(span, start, end, 0);
}
textView.setText(builder);

如前所述,这里的 CustomURLSpan 类是 URLSpan 的简单扩展,它接受一个 url 并覆盖 onClick() 方法,因此我们自己的逻辑可以在那里执行。

public class CustomURLSpan extends URLSpan {

public CustomURLSpan(String url) {
super(url);
}

@Override public void onClick(View widget) {
// custom on click behaviour here
}
}

一些基本做类似事情的相关问答(可能有助于获得更多灵感):

关于android - 从 Html.fromHtml 跨越,但使用自定义方案的自定义 ClickableSpan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15943244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com