例如,我在数据绑定的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的解决方案对我来说也很好。
答案 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