Leo*_*Aso 3 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
我这样使用它们
@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
我这里需要的是一种方法来访问块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 解决方案也适合我。
经过更多研究后,我刚刚发现了该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();
}
然后,我通过使绑定类扩展此接口并返回自身来完成循环
class Binding(val listener: Listener) : DataBindingComponent {
    override fun getBinding(): Binding {
        return this
    }
    // all the other stuff
}
这允许我在扩展视图时将其作为参数传递,因此我什至不再需要将其声明listener为 XML 变量。我可以只声明Binding实例
val bindingComponent = Binding(object : Listener {
    // implement listener methods here
})
并在扩展布局时传递它
// now I can use it in activities
DataBindingUtil.setContentView<MyActivityBinding>(
        this, R.layout.my_activity, bindingComponent)
// ...or in fragments
DataBindingUtil.inflate<MyFragmentBinding>(
        inflater, R.layout.my_fragment, parent, false)
// ...or any other place DataBindingUtil allows
| 归档时间: | 
 | 
| 查看次数: | 1838 次 | 
| 最近记录: |