资讯专栏INFORMATION COLUMN

Data Binding

cncoder / 2021人阅读

摘要:使用数据绑定可以在的布局文件中就用对象指定其显示的内容。由代码可知,类中所有域均被编入被观察者列表中,这有时并不合理。为了灵活起见,可以使用多带带对某个引用域进行转换,使用等对基本类型进行转换。

Data BindingAndroid待发布的支持库,它可以将逻辑和代码关联起来,避免开发者书写大量的胶合代码,也是实现MVVM架构的必要技术。

此前,布局文件XML被认为是相对静态的,往往需要在Java代码中处理与其有关的逻辑;数据绑定技术(Data Binding)改造了布局文件使其能够导入Java类,定义和使用变量,具备像Java代码一样的灵活性,从而使得XML文件变的更加动态化,支持更强大的功能。

添加依赖

在项目顶层的gradle中添加依赖

dependencies {
    classpath "com.android.tools.build:gradle:1.2.3"
    classpath "com.android.databinding:dataBinder:1.0-rc0"
}

在具体模块gradle配置文件中启用该插件

apply plugin: "com.android.databinding"
使用示例

给出一个Model层的User

public class User {
   public final String firstName;
   public final String lastName;
   //get&set
    ....
}

View层使用一个TextView专门负责显示User的两个名字。
在一般的实现中,TextViewUser类往往都在Activity中实例化,并实现交互逻辑。在MVP架构中,专门设立主导器P负责交互逻辑,并将User类的实例化从Activity中移出。
使用数据绑定可以在TextView的布局文件中就用User对象指定其显示的内容。这个布局文件databinding_layout.xml如下

//1.根标签为 layout


    //2.data标签定义所使用数据域对象
    
        //3.variable标签根据Java类建立变量
        
    
    //4.静态布局
    

        
    

布局文件中定义了数据层user和视图层textview的对应关系,但要传入的对象user还需要在Java代码中生成;同时这个布局文件将按名称生成一个DatabindingLayoutBinding类,位于appuildintermediatesclassesdebug<包名>databinding目录下,需要在Java代码中作为布局载入;而后将二者绑定起来。

//1.载入新布局类
DatabindingLayoutBinding binding = DataBindingUtil.setContentView(this, R.layout.databinding_layout);
//2.产生User对象
User user = new User("liu", "xiangtian");
//3.绑定布局和具体对象
binding.setUser(user);
更多用法

布局文件中data可以像Java代码一样导入类,并直接使用其类静态变量/方法,使用variable标签声明和建立对象;

类和对象的域/方法均可以在布局文件中使用,也支持相关运算,如上例中的字符连接符+

观察者模式

上述仅是数据绑定的基本功能,如果User对象一被改变,布局界面就自动更新,数据绑定才显得名副其实。其实现很容易让人联想到观察者模式,User对象继承Observable作为被观察者,但问题是这种实现更新需要主动使用notify函数来通知观察者们;为此,android使用BaseObservable类和Bindable注解实现自动通知。

要改的仅仅是User类。

//1.继承BaseObservable类成为被观察者
public class User extends BaseObservable{
    public String firstName;

    //2.给get方法Bindable注解
    @Bindable
    public String getFirstName() {
        return firstName;
    }
    //3.给set方法添加`notify`方法
    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }

}

BR亦是编译时生成类,同样位于appuildintermediatesclassesdebug<包名>目录下,其内容是:

public class BR {
    public static final int _all = 0;
    public static final int firstName = 1;
    public static final int lastName = 2;
    public static final int user = 3;
}

此后当使用user.setFirstName("li")更改数据后,布局中将相应变化。

BR代码可知,User类中所有域均被编入被观察者列表中,这有时并不合理。为了灵活起见,可以使用ObservableFields多带带对某个引用域进行转换,使用ObservableInt等对基本类型进行转换。

依然改User

public class User {
    public ObservableField firstName = new ObservableField<>();
    public ObservableField lastName = new ObservableField<>();
}

在Java代码中初始化User

User user = new User();
//ObservableField是一个包装类,提供get/set方法处理包装的内容对象
user.firstName.set("liu");
user.lastName.set("xiangtian");

布局文件仍然使用@{user.firstName}即可,不需要使用@{user.firstName.get}

绑定关系类

生成的新布局文件是一个代表绑定关系的类DatabindingLayoutBinding,这个类继承自ViewDataBinding,其中包含所有在布局中声明了的类对象 和 参与绑定的全部View,并提供了相应了set/get方法以及解除所有绑定的unbind方法。如示例中

// views
private final android.widget.LinearLayout mboundView0;
private final android.widget.TextView mboundView1;
// variables
private com.example.migratingtest.User mUser;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64752.html

相关文章

  • 新风向!成就了Android,热门框架排第一,你还是不够了解它!

    摘要:由于长期苦恼于第三方库选择的广大开发者而言,这也是谷歌为我们提供的一盏明灯。手机淘宝构架演化实践淘宝相信都不陌生了从年开始,从万增长到超过亿,面临的问题包括研发支撑所需要解决的事情各不相同。 ...

    sixgo 评论0 收藏0
  • 前端框架及库简介

    摘要:是的工具库,它内部封装了诸多对字符串数组对象等常见数据类型的处理函数,其中部分是目前尚未制订的规范,但同时被业界所认可的辅助函数。前端框架简介是当下较为流行的一个框架,它是以数据驱动和组件化的思想构建的。框架是的核心,它是一个实例。 1、js运行机制 javascript是一门单线程语言同步和异步任务分别进入不同的执行场所,同步的进入主线程,异步的进入Event Table并注册函数。...

    zhangrxiang 评论0 收藏0
  • cml迁移指南(CML Migrate Guide)

    摘要:今天,为了让大家的项目优雅升级,快速接入,给你带来一份丰盛的迁移指南目录结构和微信小程序一样,包含一个描述整体程序的和多个描述各自页面的。 cml 作为真正让一套代码运行多端的框架,提供标准的MVVM模式,统一开发各类终端。 同时,拥有各端独立的 运行时框架(runtime)、数据管理(store)、组件库(ui)、接口(api)。 此外,cml在跨端能力加强、能力统一、表现一致等方面...

    FreeZinG 评论0 收藏0
  • Vue2.x 总结

    摘要:结果对象语法。当然,使用并不是首选,只有在构建中大型单页面应用时,考虑到全局的状态管理,自然就会想到。页面路由使用创建单页面应用,就可以使用目前版本是,把组件映射到对应的路由,通过改变来渲染不同的页面。 Vue2.x 总结 Vue 是一套用于构建用户界面的渐进式框架 也意味着,既可以把VUE作为该应用的一部分嵌入到一个现成的服务端应用,或者在前后端分离的应用中,利用Vue 的核心库及其...

    banana_pi 评论0 收藏0
  • 浅谈MVC,MVP,MVVM渐进变化及React与Vue比较

    摘要:将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库。此示例使用类似的语法,称为。执行更快,因为它在编译为代码后进行了优化。基于的模板使得将已有的应用逐步迁移到更为容易。 前言 因为没有明确的界定,这里不讨论正确与否,只表达个人对前端MV*架构模式理解看法,再比较React和Vue两种框架不同.写完之后我知道这文章好水,特别是框架对比部分都是别人说烂的,而我也是打算把...

    DrizzleX 评论0 收藏0
  • JavaScript从初级往高级走系列————MVVM-Vue

    摘要:原文博客地址如何理解如何实现是否解读过的源码与框架的区别实现实现独立初始化实例两者的区别数据和视图的分离,解耦开放封闭原则,对扩展开放,对修改封闭在中在代码中操作视图和数据,混在一块了以数据驱动视图,只关心数据变化, 原文博客地址:https://finget.github.io/2018/05/31/mvvm-vue/ MVVM 如何理解 MVVM 如何实现 MVVM 是否解读过 ...

    codercao 评论0 收藏0

发表评论

0条评论

cncoder

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<