首页 > 解决方案 > 是否可以制作 2 个或更多 DataBindingComponent?

问题描述

我想问是否可以在android中制作2个或更多的DataBindingComponent类?因为我想在绑定中转义静态方法,所以我尝试使用 DataBindingComponent 的注入,但是我得到了Class 'AppDataBindingComponent' 的错误,必须要么声明为抽象,要么在 'DataBindingComponent' 中实现抽象方法 'getLoginViewDataBinding'因为这个错误我不能制作非静态的。

这是我遇到问题的课程

public class AppDataBindingComponent implements android.databinding.DataBindingComponent {
    @Override
    public RecyclerViewDataBinding getRecyclerViewDataBinding() {
        return new RecyclerViewDataBinding();
    }
}

第一个绑定类

public class RecyclerViewDataBinding {

    @BindingAdapter({"app:adapter", "app:data"})
    public void bind(RecyclerView recyclerView, DataAdapter adapter, List<DataModel> data) {
        recyclerView.setAdapter(adapter);
        adapter.updateData(data);
    }
}

第二绑定类

public class LoginViewDataBinding {

    @BindingAdapter({"validation", "errorMsg"})
    public void setErrorEnable(TextInputLayout textInputLayout, StringRule stringRule,
                                      final String errorMsg) {
        Observable<CharSequence> textObservable = RxTextView.textChanges(
                Objects.requireNonNull(textInputLayout.getEditText()));
        compositeDisposable.add(textObservable
                .map(charSequence -> {
                    ......
                })
                .distinctUntilChanged()
                .replay(1).refCount()
                .subscribe());
    }

}

在主类中,我调用 DataBindingComponent

public class MainActivity extends AppCompatActivity {
    private DataViewModel dataViewModel;
    private ActivityMainListMvvmBinding activityBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bind();
    }

    private View bind() {
        activityBinding = DataBindingUtil
                .setContentView(this, R.layout.activity_main_list_mvvm, new AppDataBindingComponent());
        dataViewModel = new DataViewModel();
        activityBinding.setViewModel(dataViewModel);
        return activityBinding.getRoot();
    }

}

如果我把getLoginViewDataBinding问题解决了

public class AppDataBindingComponent implements android.databinding.DataBindingComponent {
    @Override
    public RecyclerViewDataBinding getRecyclerViewDataBinding() {
        return new RecyclerViewDataBinding();
    }

    @Override
    public LoginViewDataBinding getLoginViewDataBinding() {
        return null;
    }
}

我想要的答案是这样的:(这可能吗?)

public class AppDataBindingComponent implements android.databinding.DataBindingComponent {
    @Override
    public RecyclerViewDataBinding getRecyclerViewDataBinding() {
        return new RecyclerViewDataBinding();
    }
}

public class LoginDataBindingComponent implements android.databinding.DataBindingComponent {
    @Override
    public LoginViewDataBinding getLoginViewDataBinding() {
        return null;
    }
}

标签: androidandroid-databindingnon-static

解决方案


那这个呢:

public class DataBindingComponent<T> implements android.databinding.DataBindingComponent {
    private T activity;

    public DataBindingComponent(T activity) {
        this.activity = activity;
    }

    public LoginViewDataBinding getLoginViewDataBinding() {
        return (LoginViewDataBinding) activity;
    }

    public RecyclerViewDataBinding getRecyclerViewDataBinding() {
        return (RecyclerViewDataBinding) activity;
    }
}

而不是在你的两个班级中创建:

new AppDataBindingComponent(this)

推荐阅读