是否可以在 TextView 中覆盖 URLSpan 以使其不会打开 Web 视图并且我可以处理对其的点击?
Posted
技术标签:
【中文标题】是否可以在 TextView 中覆盖 URLSpan 以使其不会打开 Web 视图并且我可以处理对其的点击?【英文标题】:Is it possible to override URLSpan in TextView so it doesn't opens web view and I can handle clicks on it? 【发布时间】:2021-05-04 04:35:21 【问题描述】:我从后端收到了一个动态的自定义字符串,其中包含一个 html 标记 <a href>
标记。
字符串如下所示:
"Some string from backend which have a `<a href="">`link`<a/>`. This string is passed to an app."
所以在我的 android 应用程序中,我仍然希望有一个跨度外观(粗体链接等,如 URLSpan 所具有的),但我想自己处理点击。所以我不想在点击 WebView 时打开它,我想以某种方式覆盖对它的点击。
在安卓上可以吗?
我已经尝试过类似的方法,但它不起作用,我想有一种简单的方法可以做到这一点(也许不删除旧跨度,并从头开始创建链接外观,但只是以某种方式处理/覆盖点击它并且不会丢失链接外观?)
bodyText.text = SpannableStringBuilder.valueOf(bodyText.text).apply
getSpans(0, length, URLSpan::class.java)
.forEach
//add new clickable span at the same position
setSpan(
object : ClickableSpan()
override fun onClick(widget: View)
// trigger my own listener
Toast.makeText(bodyText.context, "Clicked old span", Toast.LENGTH_SHORT).show();
,
getSpanStart(it),
getSpanEnd(it),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
//remove old URLSpan
removeSpan(it)
此代码不起作用,它只是从文本中删除了链接。
我的情况是,当我触摸提到的跨度而不触发 webview 时,我想显示一个对话框。
【问题讨论】:
从来没有做过这样的事情,只是一个可行的想法。用您自己管理的深层链接替换 href 链接。 不,我不想做这样的事情,我只想在我使用提到的 Span 时在屏幕上显示一个对话框(并且不要打开 webview) 尝试在removeSpan(it)
之前添加bodyText.movementMethod = LinkMovementMethod.getInstance()
快速搜索返回:gist.github.com/rafaeltoledo/0d29d4b937968cdadf33 这与您正在做的事情类似,但通过扩展 URLSpan 可以节省一些工作。
【参考方案1】:
bodyText.text = SpannableStringBuilder.valueOf(text).apply
getSpans(0, length, URLSpan::class.java).forEach
setSpan(
object : ClickableSpan()
override fun onClick(widget: View)
// trigger my own listener
Toast.makeText(bodyText.context, "Clicked old span", Toast.LENGTH_SHORT).show();
,
getSpanStart(it),
getSpanEnd(it),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
removeSpan(it)
// Include this to make links clickable
movementMethod = LinkMovementMethod.getInstance()
你必须添加bodyText.movementMethod = LinkMovementMethod.getInstance()
【讨论】:
以上是关于是否可以在 TextView 中覆盖 URLSpan 以使其不会打开 Web 视图并且我可以处理对其的点击?的主要内容,如果未能解决你的问题,请参考以下文章
Android中TextView的TextAppearance属性
如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?
覆盖中带有 wrap_content 的 TextView 未扩展到完整内容宽度