- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个显示一些 HTML 代码的 TextView(包括图像,ImageGetter)。html 不是我的,但我可以要求他们包含自定义方案链接,甚至标签。
目的:显示一些动态生成的内容,而不需要玩嵌套的 Android 布局。
问题:某些链接必须在应用程序中处理(加载新的 fragment )。
不能使用 receiver for action.VIEW ,因为它是一个 Activity Intent,而不是一个广播,而且它的使用将是非常有上下文的,所以只有一个以编程方式注册的接收器才可以。
我正在使用textView.setText(Html.fromHtml(content.content, imageGetter, null)
。需要一切保持不变,除了一些 Spanned 应该有我自己的onClick
就可以了。我对 Spanned 不是很熟悉,所以我看到了这些选项:
Html.fromHtml
返回的 SpannableStringBuilder,并用自定义 ClickableSpan 替换我想要的 URLSpans(怎么做?)append
仅采用 CharSequence,我得到 RelativeSizeSpan、StyleSpan、ImageSpan、URLSpan...) 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/
我有一个带有多个 ClickableSpans 的 TextView。当按下 ClickableSpan 时,我希望它更改其文本的颜色。 我尝试将颜色状态列表设置为 TextView 的 textCo
我有一个 TextView,里面有多个 ClickableSpan。当按下 ClickableSpan 时,我希望它改变其文本的颜色。 我尝试将颜色状态列表设置为 TextView 的 textCol
我是 Android 开发的新手。我一直收到此错误,因为我试图添加打开弹出窗口的选项(onClick())。 看起来错误在第 29->36 行,因为一旦我注释掉该部分,我就不会收到此错误。 有人知道发
我正在尝试将数据存储在 ClickableSpan 中,就像它可以通过 setTag() 和其他类型的元素来完成一样。 我在 stackoverflow 中读到了这个答案: SpannableStri
我在 TextView 上使用了 ClickableSpan。添加跨度后,应用它的文本颜色也发生了变化。 检查 SO 问题,我看到的是点击后颜色变了。在我的例子中,颜色在渲染 View 时已经不同了。
我在布局中有一个 TextView。就是这么简单。我在布局中放置了一个 OnClickListener,TextView 的某些部分设置为 ClickableSpan。我希望 ClickableSpa
我有一个 SpannableString 设置为我的 TextView 的文本,它位于另一个具有点击处理程序的 View 中。我的文本中有 ClickableSpan,您说得对,可以点击。 我的问题是
我有下一个代码用于添加 EditText 图像: fun bind() { val ssb = SpannableStringBuilder(".")
我有一个 TextView,其中所有单词都可以单独点击。我想从每一个没有风格的词开始。单击一个词后,该词应变为并保持下划线。我能够清除默认下划线,但点击后没有任何反应。 (我正在捕获甚至处理点击,但我
我有一个 TextView,其中每个单词都是一个 ClickableSpan。单击时,该词变为粗体,该词的字典定义显示在另一个TextView 中。在我使 TextView 中的文本可选择之前,该应用
我正在创建一个 ClickableSpan,它可以正确显示正确的文字加下划线。但是,点击没有注册。你知道我做错了什么吗??? 谢谢,维克托 这是代码 fragment : view.setText("
我有一个 TextView,其中每个单词都是一个 ClickableSpan(实际上是 ClickableSpan 的自定义子类)。当一个词被触摸时,它应该以粗体显示。 如果我在 TextView 上
我有一个 TextView,我在其中设置了 HTML 文本。这篇文章有很多链接。当您点击一个链接时,它并不总是触发 onClick 方法。因此,我正在尝试扩展 ClickableSpan 的区域,以便
我正在处理 TextView 中的 ClickableSpan,并且我正在尝试获取单击范围的文本。这是我的代码。 // this is the text we'll be operating on S
我必须在段落文本中嵌入可点击的文本,clickablespan 可以做到。但是,我可以更改这些样式,而不是使用默认的焦点/按下/取消焦点样式吗?比如对焦时背景色为蓝色,文字颜色为白色,未对焦时背景色为
我有一个带有 ClickableSpan 的 SpannableString,如下所示 for (int i = 0; i < items.size(); i++) { fin
我正在创建一个 ClickableSpan,它可以正常显示适当的文字加下划线。但是,点击未注册。你知道我做错了吗??? 谢谢,维克多 这里是代码 fragment : view.setText("Th
我正在尝试在我的 TextView 中实现可点击的主题标签,如下所示: mTextView.setMovementMethod(LinkMovementMethod.getInstance()); S
在 stackoverflow 上有类似的问题,但是他们回答的是“如何突出显示 onclick” 而不是 ontouch 有没有办法(例如)设置 clickablespan ontouch 的背景颜色
这个问题困扰我很久了。我得到的是一个简单的字符串 "This is a link and this is another link"。我想让两个“链接”字词都可以点击,并在浏览器中打开不同的 URL。
我是一名优秀的程序员,十分优秀!