是否可以在 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 视图并且我可以处理对其的点击?的主要内容,如果未能解决你的问题,请参考以下文章

tableviewcell中的Textview被覆盖

Android中TextView的TextAppearance属性

如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?

覆盖中带有 wrap_content 的 TextView 未扩展到完整内容宽度

请问在Android中Textview换行显示问题,您如何解决?

是否可以在 TextView 中显示复杂的 HTML 内容?