Android DataBinding:将BindingAdapter改为实例方法后需如何配置?
如何为实例方法类型的BindingAdapter配置自定义DataBindingComponent
这个问题我之前也踩过坑,其实只要按下面几个步骤来,就能让DataBinding框架正确调用你的实例BindingAdapter方法:
1. 定义自定义DataBindingComponent接口
首先需要创建一个继承自android.databinding.DataBindingComponent的接口,里面声明你BindingAdapter所属类的getter方法,框架会通过这个方法获取实例:
import android.databinding.DataBindingComponent; public interface MyDataBindingComponent extends DataBindingComponent { // 返回你的BindingAdapter所在类的实例 MyClass getMyClass(); }
2. 在Activity中实现并提供这个Component实例
接下来在你的Activity里,实现这个自定义接口,或者直接创建匿名实例,然后在初始化DataBinding的时候传入这个component:
import android.databinding.DataBindingUtil; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.yourpackage.databinding.ActivityMyBinding; public class MyActivity extends AppCompatActivity { // 创建自定义Component的实例 private MyDataBindingComponent myComponent = new MyDataBindingComponent() { @Override public MyClass getMyClass() { // 这里返回MyClass的实例,你可以根据需求创建单例、带依赖的实例等 // 比如如果MyClass需要Context或者ViewModel,直接传进去就行 return new MyClass(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化DataBinding时传入自定义的component ActivityMyBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_my, myComponent); // 后续正常使用binding对象即可,框架会自动通过component获取MyClass实例来调用bindItems方法 } }
3. 确保你的BindingAdapter类和方法正确
你的MyClass里的实例BindingAdapter方法不需要做额外修改,保持之前的写法就行:
import android.support.v4.view.ViewPager; import android.databinding.BindingAdapter; import java.util.List; public class MyClass { @BindingAdapter("bindItems") public void bindItems(ViewPager viewPager, List<String> items) { // 这里写你的绑定逻辑,比如给ViewPager设置适配器之类的 } }
关键原理
当BindingAdapter是实例方法时,DataBinding框架没办法直接创建类的实例(因为它不知道你的类有没有构造参数、依赖什么),所以自定义DataBindingComponent的作用就是告诉框架:“要调用MyClass里的BindingAdapter方法?找我拿实例就行!”,框架会通过你定义的getter方法获取实例,再调用对应的绑定方法。
内容的提问来源于stack exchange,提问作者fweigl
相关产品推荐
相关产品推荐

