每个活动的自定义DataBindingComponent

asc*_*sco 5 android android-databinding

我可以这样创建一个BindingAdapter

public class MyClass {

  @BindingAdapter("bindItems")
  public static void bindItems(ViewPager viewPager, List<String> items) {

  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我不希望此绑定方法是静态的,而是希望封闭类的实例方法,则只需忽略static关键字:

public class MyClass {

  @BindingAdapter("bindItems")
  public void bindItems(ViewPager viewPager, List<String> items) {

  }
}
Run Code Online (Sandbox Code Playgroud)

但随后,我必须为数据绑定框架提供一种方法,以获取包含@BindingAdapter方法(MyClass)的类的实例。

使用DataBindingComponent的自定义实现可以实现这一点,如下所示:

public class MyDatabindingComponent implements android.databinding.DataBindingComponent {

  public getMyClass() {
    return new MyClass(); 
  }
}
Run Code Online (Sandbox Code Playgroud)

并且在设置“活动”的内容视图时使用,例如:

DataBindingUtil.setContentView(this, R.layout.activity_test, new MyDatabindingComponent);
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利...但是! 此自定义DataBindingComponent必须@BindingAdapter使用整个应用程序的非静态方法创建类的实例。

这很快就会失控,特别是当实例的创建不像我的例子那么简单时。我知道我可以使用DI,例如Dagger来更轻松地创建MyDataBindingComponent,但我仍然不满意将很多东西注入到我的Activity中,而在该特定Activity中并不需要很多东西。

失去控制的DataBindingComponent的示例

public class MyDatabindingComponent implements android.databinding.DataBindingComponent {

  MyClass myClass;
  MyClass2 myClass2;
  MyClass3 myClass3;

  @Inject
  public MyDatabindingComponent(MyClass myClass, MyClass2 myClass2, MyClass3 myClass3) {
    this.myClass = myClass;
    this.myClass2 = myClass2;
    this.myClass3 = myClass3;
  }

  public getMyClass() {   // needed in Activity A
    return myClass; 
  }

  public getMyClass2() {   // needed in Activity B
    return myClass2; 
  }

  public getMyClass3() {   // needed in Activity C
    return myClass3; 
  }
}
Run Code Online (Sandbox Code Playgroud)

是否有任何方法可以使这些DataBindingComponent按活动进行,因此它仅需提供我使用它的活动中所需的实例?