如何在Android上将架构组件与数据绑定结合起来?

17

我已经基于Android Data Binding库开发了应用程序:https://developer.android.com/topic/libraries/data-binding/index.html

class SignInViewModel extends BaseObservable {

    @Bindable
    public String getLogin() {
        return login;
    }

    @Bindable
    public String getPassword() {
        return password;
    }
}

现在我想要使用来自新库的ViewModelProviders: https://developer.android.com/topic/libraries/architecture/guide.html


SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModel.class);

如何将它们结合起来?有什么想法吗?还是应该将这两个库结合起来?

编辑

我改为:

class SignInViewModel extends ViewModel {
   public ObservableField<String> login = new ObservableField<>("");

    public ObservableField<String> password = new ObservableField<>("");
}

现在编译通过了,但问题是:这是正确的方式吗?


我找到了一篇关于这个主题的文章。简短回答是,目前还没有“正确”的方法,我们可能需要等待数据绑定团队的一些消息。 - yennsarah
4个回答

15

这是一个已知的不兼容性问题。您不能同时扩展BaseObservableAndroidViewModel,因此无法使用@Bindable进行双向数据绑定,这是不可能的*。

在架构组件1.0正式版发布后,这个问题将得以解决(在数据绑定方面)。

*编辑:您可以创建自己的ObservableViewModel:https://gist.github.com/JoseAlcerreca/4b66f9953d50b483d80e6b9ad7172685


那么,使用ObservableField的解决方案是可行的替代方法? - LunaVulpo
1
如果你可以限制使用ObservableField,那就没问题了。 - Jose Alcérreca
1
@JoseAlcérreca,现在架构组件已经更新到1.0版本了,但是我没有发现在与DataBinding结合使用时有什么不同,难道我漏掉了什么吗?至少在发布说明中我没有找到任何相关信息。 - Darwind
1
它已经在数据绑定方面完成了,并正在进行中! - Jose Alcérreca
1
大家好,有没有人能提供一个示例链接,展示如上所述使用了ViewModel和双向数据绑定的示例。拜托啦... - iMDroid
显示剩余2条评论

7
也许在问题提出时还不存在,但是这篇文章中解释了另一种选择:https://medium.com/google-developers/android-data-binding-observability-9de4ff3fe038。基本上,您可以通过实现android.databinding.Observable来代替扩展BaseObservable。这需要进行一些额外的工作,包括以下步骤:
  1. Create this variable in your model class

    private PropertyChangeRegistry registry = new PropertyChangeRegistry();
    
  2. Implement the overriden methods like this

    @Override
    public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.add(callback);
    }
    
    @Override
    public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.remove(callback);
    }
    
  3. Replace all the "BR" calls with these:

    registry.notifyChange(this, BR.bar);
    

除了继承自BaseObservable的方式外,其他方面的工作都是相同的。因此,我认为这可能是Jose一直在暗示的解决方案,但那时可能还没有。它似乎可以正常工作。

更新: 正如Eugene Brusov所提到的,现在您可以使用LiveData与数据绑定。这就是我现在正在做的,并且更简单、减少了样板代码。请参见https://developer.android.com/topic/libraries/data-binding/architecture


4

1

这也可以使用包装器来解决:

class SignInViewModelWrapper extends ViewModel {
    public final SignInViewModel model = new SignInViewModel();
}

class SignInViewModel extends BaseObservable {

    @Bindable
    public String getLogin() {
        return login;
    }

    @Bindable
    public String getPassword() {
        return password;
    }
}

您可以这样获取视图模型:

SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModelWrapper.class).model;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接