每个Activity的自定义DataBindingComponent

时间:2018-04-12 14:39:27

标签: android android-databinding

我可以像这样创建一个BindingAdapter

public class MyClass {

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

  }
}

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

public class MyClass {

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

  }
}

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

这可以通过DataBindingComponent的自定义实现来实现,如下所示:

public class MyDatabindingComponent implements android.databinding.DataBindingComponent {

  public getMyClass() {
    return new MyClass(); 
  }
}

并在设置活动的内容视图时使用,如下所示:

DataBindingUtil.setContentView(this, R.layout.activity_test, new MyDatabindingComponent);

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

这很快就会失控,特别是当实例的创建不像我的例子那样微不足道时。我知道我可以使用DI,例如Dagger更容易创建MyDataBindingComponent,我仍然不满意在我的活动中注入大量内容,而在该特定活动中并不需要这些内容。

获取失控的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; 
  }
}

有没有办法让这些DataBindingComponent按活动进行,所以它只提供我在其中使用的活动所需的实例?

0 个答案:

没有答案