如何从BindingAdapter访问数据绑定变量

时间:2018-07-22 21:29:59

标签: java android kotlin android-databinding

例如,我在数据绑定的XML中具有以下变量。

<layout ...>
    <data>
        <variable name="listener" type="com.xyz.Listener" />
        <!-- and other variables -->
    </data>
    ...
</layout>

我在数据绑定的每个布局中都使用此变量,并且我需要在@BindingAdapter的几乎每个布局中使用它。例如,我的绑定适配器通常看起来像这样。

@BindingAdapter("board")
fun setBoard(view: TextView, board: Board) {
    view.setText(board.name)
    view.setOnClickListener {
        listener.onBoardClicked(board)
    }
}

@BindingAdapter("topic")
fun setTopic(view: TextView, topic: Topic) {
    view.setText(topic.name)
    view.setOnClickListener {
        listener.onTopicClicked(topic)
    }
}

// and a few others like that

我这样使用它们

<TextView ... app:board="@{board}" ... />
<TextView ... app:topic="@{topic}" ... />

我这里需要的是一种将listener块中声明的data变量访问所有绑定适配器的方法。有没有一种方法可以避免每次都手动将其作为第二个变量传递?

// I know I can do this - looking for an alternative
@BindingAdapter({"board", "listener"})
fun setBoard(view: TextView, board: Board, listener: Listener) {
    view.setText(board.name)
    view.setOnClickListener {
        listener.onBoardClicked(board)
    }
}

我在这里使用Kotlin,但是Java的解决方案对我来说也很好。

1 个答案:

答案 0 :(得分:1)

经过更多研究后,我才发现core界面,它恰好解决了我遇到的问题。显然,如果使绑定适配器实例方法而不是静态方法,则编译器将采用您在其中声明的类,并将其添加为trait SoftwareComp { this: GetSectionsOfTypeComp => class Software(val file: File) { def codeSections[SectionType <: SoftwareSection]: Seq[SectionType] = { sectionsOfType[SectionType].getAll(openStream) } def openStream: InputStream = new FileInputStream(file) } } 的属性。因此,我制作了绑定适配器实例方法,并通过构造函数注入了想要的变量。

DataBindingComponent

构建后,编译器生成以下接口

DataBindingComponent

然后我通过使绑定类扩展此接口并返回自身来完成循环

class Binding(val listener: Listener) {

    @BindingAdapter("board")
    fun setBoard(view: TextView, board: Board) {
        view.setText(board.name)
        view.setOnClickListener {
            listener.onBoardClicked(board)
        }
    }

    @BindingAdapter("topic")
    fun setTopic(view: TextView, topic: Topic) {
        view.setText(topic.name)
        view.setOnClickListener {
            listener.onTopicClicked(topic)
        }
    }
}

这允许我在放大视图时将其作为参数传递,因此,我什至不必将package android.databinding; public interface DataBindingComponent { com.my.package.Binding getBinding(); } 声明为XML变量。我可以声明class Binding(val listener: Listener) : DataBindingComponent { override fun getBinding(): Binding { return this } // all the other stuff } 实例

listener

并在布局放大时通过它

Binding