我最初在使用这个旧的库时有这段代码,这里的想法是支持数据中存在多个表标签然后在 TextView 中渲染多个表跨度的场景。要获取 onclick 事件,它使用
newInstance()
方法。
htmlTxtV.setClickableTableSpan(ClickableTableSpanImpl(intentDomain))
inner class ClickableTableSpanImpl(private val intentDomain: WordPressPostDataDomain) :
ClickableTableSpan() {
override fun newInstance(): ClickableTableSpan {
return ClickableTableSpanImpl(intentDomain)
}
override fun onClick(widget: View) {
// Do task here
}
}
如果我将其转换为匿名对象
setClickableTableSpan(object : ClickableTableSpan() {
override fun newInstance(): ClickableTableSpan {
return this
}
override fun onClick(widget: View) {
// Do task here
}
})
我只从最后一个跨度得到单个回调。这意味着
return this
不等于 return ClickableTableSpanImpl()
。是否可以仅使用匿名对象来创建新实例?
您基于
inner class
的方法本身就很好。如果您只是想“了解更多有关该语言的可能性”,也可以声明这样的局部函数:
fun main() {
fun clickableTableSpan(): ClickableTableSpan = object: ClickableTableSpan {
override fun newInstance(): ClickableTableSpan {
return clickableTableSpan()
}
// ...
}
setClickableTableSpan(clickableTableSpan())
}
如果您想在单个表达式中执行此操作,您可以将整个事情包装到立即调用的 lambda 表达式中。
setClickableTableSpan({
fun clickableTableSpan(): ClickableTableSpan = object: ClickableTableSpan {
override fun newInstance(): ClickableTableSpan {
return clickableTableSpan()
}
}
clickableTableSpan()
}())
但是在我看来,
inner class
更具可读性。