当前位置: 首页 > 知识库问答 >
问题:

如何在android上结合架构组件和数据绑定?

何琨
2023-03-14

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

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

共有3个答案

齐雅畅
2023-03-14

它可能与Android Studio 3.1金丝雀6(https://androidstudio.googleblog.com/2017/12/android-studio-31-canary-6-is-now.html):

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

你可以在这篇媒体文章中找到更多的细节和样本。

赵奕
2023-03-14

也许当这个问题被问到的时候,这并不存在,但是在这篇文章中解释了另一个选择:https://medium.com/google-developers/android-data-binding-observability-9de4ff3fe038

基本上,您可以实现android,而不是从BaseObservable扩展。数据绑定。可见的。

由于您还需要执行以下操作,因此需要做更多的工作:

>

  • 模型类中创建此变量

    private PropertyChangeRegistry registry = new PropertyChangeRegistry();
    

    实现这样的重写方法

    @Override
    public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.add(callback);
    }
    
    @Override
    public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.remove(callback);
    }
    

    将所有“BR”呼叫替换为以下内容:

    registry.notifyChange(this, BR.bar);
    

    其他一切都与从BaseObservable扩展相同。所以我认为这可能是Jose提到的解决方案,但当时可能没有。它似乎起作用了。

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

  • 何涵畅
    2023-03-14

    这是一种已知的不相容性。不能同时扩展BaseObservableAndroidViewModel,因此不能使用@Bindable进行双向数据绑定

    这将在arch components 1.0 final(数据绑定端)之后修复。

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

     类似资料:
    • 我有一个结构数组 我希望合并并按升序排序数组。然而,当我执行合并时,没有任何变化。这是我用来创建struct数组的代码,以及MergeSort的函数调用。最大用户数是我从二叉树中转换节点数得到的整数,它应该是数组的最大数量。 任何提示或提示都将不胜感激! 编辑:当我尝试编写一些printf语句时,我注意到这些值是负数。但是存储在结构中的值是正数。这个错误的原因是什么?

    • 我正在使用Kotlin,kapt和Android架构组件。当我构建项目时,一切似乎都很好,但在试图在设备/模拟器上运行应用程序后,Gradle的:Assemble任务抛出以下错误: 警告:警告:注释处理器“Android.arch.persistence.room.RoomProcessor”支持的源版本“release_7”小于-source“1.8” 更新 模块构建。在此处分级 项目生成。gr

    • 我知道如何使用ViewModel,Repository和Room将数据从数据库传输到屏幕。但是如何使用POST方法实现登录活动。我需要从ViewModel或AuthorizationRepository创建LiveData isAuthorated吗?有人能展示在android架构组件中使用命令方法的示例吗?

    • 本文向大家介绍集合框架底层数据结构总结一下?相关面试题,主要包含被问及集合框架底层数据结构总结一下?时的应答技巧和注意事项,需要的朋友参考一下 Collection 1. List Arraylist: Object数组 Vector: Object数组 LinkedList: 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环) 2. Set HashSet(无序,唯一): 基于 Ha

    • 书籍: 数据结构与算法javascript描述 数组比较简单,这里只是简单介绍: 1.使用数组 1.1 创建数组 //第一种形式 var numbers = new Array(3); //第二种形式 var numbers = [7,4,1776]; 大多数JavaScript 专家推荐使用[]操作符,和使用Array 的构造函数相比,这种方式被认为效率更高(new创建的对象,会一直存在于内存