ClickableSpan的高阶功​​能

时间:2019-11-13 21:26:20

标签: android kotlin android-databinding kotlin-android-extensions

我正在尝试捕获具有链接的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中的函数。

谢谢。

1 个答案:

答案 0 :(得分:1)

您应该展开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){

}