ClickableSpan的高阶功​​能

我正在尝试捕获具有链接的textview上的点击。 要实现这一点:

  • 我创建了一个具有两个参数的BindingAdapter(a:TextView,clicklistener:()->单元)。
  • 在BindingAdapter内部:

    • val clickableSpan = object : ClickableSpan() {
        override fun onClick(widget: View) = onClicklistener.invoke()
      } ``` 
      
  • 在ViewModel中,我创建了一个fun processUrl() { Code Here }

  • 在layout.xml中:
    • <TextView app:infowithlinks="@{() -> model.processUrl()}"

一切正常,我希望当我单击TextView上的链接时,能够将Url发送到ViewModel中的函数。

谢谢。

hongxiu1016 回答:ClickableSpan的高阶功​​能

您应该展开onClickListener以接受字符串。然后用参数调用它。

  @BindingAdapter("infowithlinks")
    fun TextView.setOnSpanClickListener(clickListener:Function1<String,Unit>){
        val clickableSpan = object : ClickableSpan() {
            override fun onClick(widget: View){
              with(text as SpannableString) {
                val clickableSpan = getSpans<ClickableSpan>()
                    .first() // probably search correct one
                val start = getSpanStart(clickableSpan)
                val end = getSpanEnd(clickableSpan)
                val url = text.subSequence(start,end).toString()
                clickListener(url)
               }
            }
        }  
        //....

    }

您将在xml上

<TextView app:infowithlinks="@{model.processUrl}"

在视图模型中

fun processUrl(url : String){

}
本文链接:https://www.f2er.com/3106678.html

大家都在问