早上看到了一篇推文“还在使用繁琐的findViewById,跟着尝试了一下DataBinding,之前使用ButteKnife就已经干掉了findViewById。因为写过微信小程序,那种在js中数据源改变,UI中的数据跟着改变,真的很爽。

本文个人拙见,如果有误人子弟处,请提出,感激——来自小渣渣的颤抖

配置

关于DataBinding的介绍不说了,我也没搞懂,先会用。

appbuild.gradle中添加如下内容,表示支持数据绑定,(个人理解)因为使用数据绑定会通过布局文件自动生成许多的东西,见后面。

android {
.....
dataBinding {
enabled = true;
}
}

布局使用

新建一个activity,在其layout中使用如下

<layout>
<data>
<variable name="user" type="com.jiajia.mypractisedemos.module.jetpack.User"/>
</data> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.jiajia.mypractisedemos.module.jetpack.JetpackActivity"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.userName}"/> <Button
android:layout_width="wrap_content"
android:text="更换User"
android:layout_height="wrap_content" />
......
</LinearLayout>
</layout>

这里布局的根节点不是平时使用的几大布局了,而是layout,看其他的文章说使用layout会自动生成绑定类(见后面)。

在data标签下新建变量variable,设置name属性和type属性,name随便取,在本xml中使用,这里的type可以是我们平时使用的基本数据类型,也可以是自己封装的类等,显而易见就是布局文件需要使用的数据,这里定义了一个User类,多么通用的栗子啊。User类就是个简单的Model啦

public class User{
private String userName;
private int age; public User(String userName, int age) {
this.userName = userName;
this.age = age;
}
public String getUserName() {
return userName == null ? "" : userName;
} public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}

再回到xml中,这里复制一下TextView节点,便于浏览

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.userName}"/>

android.text = "@{user.userName}",使用@{}即可取user中的值,这个user就是顶部定义的绑点数据啦,到这里,我开始思考,这个user是不是到时候我在我的Activity中进行绑点操作就可以直接显示到我的界面了啊。bingo,废话,不然叫数据绑定啊。

Activity中绑定

有了布局文件,有了需要绑点的数据,怎么在将其进行绑定了,说白了,我界面需要使用user这个对象,我总得初始化吧。

很简单了,在Activity中,创建两个全局变量

ActivityJetpackBinding binding;
User user;

这里user没什么好说了,那个ActivityJetpackBinding是什么鬼,说一下我的Activity名字叫JetpackActivity,so,这个类就是前面我说的自动生成的啦,怎么实例化呢。

binding = DataBindingUtil.setContentView(this,R.layout.activity_jetpack);

使用DataBindingUtil就可以了,咦,这个setContentView好熟悉,一般onCreate中都有这个,一想到绑定,难道这句话会把之前的那个setContentView也干掉了,我小心翼翼的去掉之前的setContentView,果然可以运行,那怎么干掉的呢(其实不用看,我只是好奇怎么干掉的,所以看看源码),

点进去看到

public static <T extends ViewDataBinding> T setContentView(Activity activity, int layoutId) {
return setContentView(activity, layoutId, sDefaultComponent);
}

再点return后面的setContentView

public static <T extends ViewDataBinding> T setContentView(Activity activity, int layoutId,
DataBindingComponent bindingComponent) {
activity.setContentView(layoutId);
View decorView = activity.getWindow().getDecorView();
ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content);
return bindToAddedViews(bindingComponent, contentView, 0, layoutId);
}

ok,熟悉的 activity.setContentView(layoutId);

说明确实干掉了。

得到了binding对象,新建一个User,怎么将新建的User和binding联系起来呢

原来binding有setter和getter啦binding.setUser(user);,就这样,运行时,TextView的值有了,全程没有使用之前的setTex(),完整一点的onCreate代码

//        setContentView(R.layout.activity_jetpack);
binding = DataBindingUtil.setContentView(this,R.layout.activity_jetpack);
user = new User("家佳",25);
binding.setUser(user);

到这里,基本的绑定就实现了,算是入门了吧,来看看和之前的区别,布局文件中没有id,activity中没有绑定id,没有setText,确实看起来少了许多。But.....

这肯定不是我要的效果啊,我要的是改变user的值,界面跟着改变,不用去setText

所以我开始思考

思考

如果我改变User的值,界面会跟着变吗?其实肯定会的,只是我还不知道怎么用,我的想法很单纯,很简单,搞个Button,点击需改全局User的值,界面跟着变,ok,我写了,然而打了自己的脸,我怎么这么可爱,too young 以为 很simple。

那么怎么才能实现这个效果呢。

动态绑定

原来需要再User这个类上下功夫

数据绑定提供了基类BaseObservable,需要继承它,修改后的User如下


public class User extends BaseObservable{
private String userName;
private int age;
public User(String userName, int age) {
this.userName = userName;
this.age = age;
}
@Bindable
public String getUserName() {
return userName == null ? "" : userName;
}
public void setUserName(String userName) {
this.userName = userName;
notifyPropertyChanged(BR.userName);
}
@Bindable
public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
notifyPropertyChanged(BR.age);
}
}

在getter上面加@Bindable,在setter函数中加notifyPropertyChanged,好熟悉Adapter啊,一看这个实现应该是观察者模式啦。这里notifyPropertyChanged需要一个int参数,查看一番,据说类似R.java中的id一样,不懂,看别人用的BR,直接用BR即可,关于BR是啥,还不知道。

更改了User类之后,在之前的button中通过user.setUsername(),完美实现了布局中数据的改变。

最后

数据绑定还有很多东西,比如动态绑定,不需要这么麻烦,比如Button的onClick事件也可以绑定,下篇再说把。

此致,敬礼

Android数据绑定DataBinding(一)入门篇的更多相关文章

  1. Android数据绑定DataBinding(二)入门篇

    前言 之前写了Android数据绑定DataBinding(一)入门篇,很简单的记录了如何使用DataBinding,其初衷是想要代码中的数据发生改变,不需要繁琐的setText等操作,在最后说到了只 ...

  2. 在android 上 使用 rxjava 入门篇

    什么是 rxJava? RxJava is a Java VM implementation of Reactive Extensions: a library for composing async ...

  3. Android Studio2.0 教程从入门到精通Windows版 - 入门篇

    http://www.open-open.com/lib/view/open1468121363300.html 本文转自:深度开源(open-open.com)原文标题:Android Studio ...

  4. 【Android开发日记】之入门篇(十二)——Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  5. 【Android开发日记】之入门篇(三)——Android目录结构

    本来的话,这一章想要介绍的是Android的系统架构,毕竟有了这些知识的储备,再去看实际的项目时才会更清楚地理解为什么要这样设计,同时在开发中遇到难题,也可以凭借着对Android的了解,尽快找出哪些 ...

  6. Unity3D大风暴之入门篇(海量教学视频版)

    智画互动开发团队 编   ISBN 978-7-121-22242-9 2014年2月出版 定价:79.00元 328页 16开 编辑推荐 长达800分钟的高清教学视频,手把手教会初学者 数个开发案例 ...

  7. Android Studio教程从入门到精通

    最新2.0系列文章参考: Android Studio2.0 教程从入门到精通Windows版 - 安装篇Android Studio2.0 教程从入门到精通Windows版 - 入门篇Android ...

  8. Android Studio JNI开发入门教程

    Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报  分类: JNI(3)    目录(?)[+]   概述 在Andorid ...

  9. 【Unity游戏开发】SDK接入与集成——小白入门篇

    一.简介 通常一款游戏开发到后期,一般都会涉及到第三方SDK的接入与集成,对于不熟悉SDK接入的同学来说,接SDK每次都是云里雾里,而熟悉SDK接入的同学又觉得不断地重复做接入SDK工作这样没有成就感 ...

随机推荐

  1. 开源项目hutool之zip_slip漏洞

    今天突然看到了去年写的一篇漏洞分析文章,搬到博客上 ---------------- Hutool是Github上的一个开源项目,是一个java的工具包,对文件.流.加密解密.转码.正则.线程.XML ...

  2. sql server存储过程解密

    解密存储过程: USE [RYTreasureDB] GO /****** Object: StoredProcedure [dbo].[sp__windbi$decrypt] Script Date ...

  3. 在pivotal cloud foundry上申请账号和部署应用

    Created by Wang, Jerry, last modified on Jul 04, 2016 URL: http://run.pivotal.io/ maintain your mobi ...

  4. springboot学习入门简易版三---springboot2.0启动方式

    2.4使用@componentscan方式启动 2.4.1 @EnableAutoConfiguration 默认只扫描当前类 @EnableAutoConfiguration 默认只扫描当前类,如果 ...

  5. redis重命名flushall和flushdb重启失败

    redis重命名flushall和flushdb,将使用中的redis重命名redis会启动失败并且log中有报错 # Unknown command 'flushall' reading the a ...

  6. Jenkins企业应用

    一,CI/CD,DevOps介绍 持续集成(Continuous Integration,CI): 代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈 持续交付(Continuous ...

  7. 多个ip地址匹配正则表达式

    匹配规则:多个ip地址使用,号进行分割 例如:1.1.1.1,2.2.2.2var iplist =/^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}( ...

  8. JDBC课程4--使用PreparedStatement进行增删查改--封装进JDBCTools的功能中;模拟SQL注入 ; sql的date()传入参数值格式!

    主要内容: /*SQL 的date()需要传入参数值: preparedStatement().setDate(new java.util.Date().getTime()); 熟悉了使用Prepar ...

  9. BZOJ 3601 一个人的数论 (拉格朗日插值+莫比乌斯反演)

    题意 略 题解 orz Freopen的博客 CODE #pragma GCC optimize (3) #include <bits/stdc++.h> using namespace ...

  10. XML建模实列

    XML建模 建模的由来: 就是将指定的xml字符串当作对象来操作           好处在于,只需要调用指定的方法就可以完成预定的字符串获取: 建模的一个思路: 1.分析需要被建模的文件中有那几个对 ...