【问题标题】:how to combine Architecture Components with data binding on android?如何将架构组件与android上的数据绑定结合起来?
【发布时间】:2017-10-20 00:39:54
【问题描述】:

我已经开发了基于android数据绑定库的app: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<>("");
}

现在编译,但问题是:它是正确的方式吗?

【问题讨论】:

  • 我找到了一个关于这个话题的article。简短的回答,目前没有“正确”的方法,我们可能不得不等待数据绑定团队自己的一些消息。

标签: android data-binding android-databinding


【解决方案1】:

这是一个已知的不兼容问题。不能同时扩展BaseObservableAndroidViewModel,所以不能使用@Bindable进行双向数据绑定impossible*。

这将在 Arch 组件 1.0 最终版(在数据绑定方面)之后修复。

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

【讨论】:

  • 作为一种解决方法,使用 ObservableField 的解决方案是正确的方法吗?
  • 是的,如果您可以限制使用ObservableFields,那就没问题了。
  • @JoseAlcérreca 现在架构组件在 1.0 中,在将它们与 DataBinding 结合时我看不到任何差异,还是我遗漏了什么?我至少在发行说明中找不到任何关于此的内容。
  • 在数据绑定方面已经完成,并且正在工作中!
  • 您好.. 有人可以提供一个示例链接,该链接使用 ViewModel 和上面讨论的 2 路数据绑定。拜托……
【解决方案2】:

可能在提出问题时不存在,但本文中解释了另一个选项:https://medium.com/google-developers/android-data-binding-observability-9de4ff3fe038

基本上,您可以实现 android.databinding.Observable,而不是从 BaseObservable 扩展。

因为您还需要执行以下操作,所以需要做更多的工作:

  1. 在你的模型类中创建这个变量

    private PropertyChangeRegistry registry = new PropertyChangeRegistry();
    
  2. 像这样实现被覆盖的方法

    @Override
    public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.add(callback);
    }
    
    @Override
    public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.remove(callback);
    }
    
  3. 用这些替换所有“BR”调用:

    registry.notifyChange(this, BR.bar);
    

其他一切都与从 BaseObservable 扩展相同。所以我认为这可能是 Jose 可能暗示的解决方案,当时可能不可用。它似乎有效。

更新: 正如 Eugene Brusov 所提到的,您现在可以将 LiveData 与数据绑定一起使用。这就是我现在正在做的事情,使用更少的样板就容易多了。见https://developer.android.com/topic/libraries/data-binding/architecture

【讨论】:

    【解决方案3】:

    Android Studio 3.1 Canary 6 (https://androidstudio.googleblog.com/2017/12/android-studio-31-canary-6-is-now.html) 可以实现:

    您现在可以将 LiveData 对象用作数据绑定表达式中的可观察字段。 ViewDataBinding 类现在包含一个新的 setLifecycle 方法,您需要使用它来观察 LiveData 对象。

    您可以在此Medium post 中找到更多详细信息和示例。

    【讨论】:

      【解决方案4】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-17
        • 2011-11-04
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多