Android Jetpack Databinding入门

Databinging

基础入门

  1. 首先在模块的build.gradle添加databinding支持
android {
    ...
    dataBinding{
        enabled = true
    }
    ...
}
  1. 然后我们新建一个实体:
public class User extends BaseObservable {
    private String name;//名字
    private String intro;//简介

    //getter and setter
}
  1. 创建布局文件activity_view_model.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/tools">

    <data>

        <variable
            name="user"
            type="org.zgc.aac.bean.entity.User" />

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="@{user.name}"
            android:textSize="14sp"
            bind:text="Name" />

        <TextView
            android:id="@+id/tv_intro"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="@{user.intro}"
            android:textSize="14sp"
            bind:text="Name" />

    </LinearLayout>

</layout>

这里要注意一下,最外层是<layout>标签,<layout>标签里面只允许包含一个数据元素(data)和一个布局元素 (别问我为什么,因为这是固定写法)

数据元素

上面布局中<data>里面使用了<variable>来声明一个变量,属性name定义变量名,属性type定义该变量的引用

布局元素

这里要注意的一点是布局元素最外局必需是一个ViewGroup,我们先留意一下这里android:text="@{user.intro}",然后下面会说到。

  1. 创建ActivityViewModelActivity.java
    在onCreate方法添加如下代码
@Override
protected void onCreate(Bundle savedInstanceState) {.
  super.onCreate(savedInstanceState);

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

  //创建一个User对象,并添加数据
  User user = new User();
  user.setName("ZGC");
  user.setIntro("这个人很懒,什么也没写!");

  //把User对象和布局文件进行绑定了
  binding.setUser(user);
}

运行一下看效果:


databinding1.png

可以看到User对象的信息在界面显示出来,并不用手动去设置。
那它的值是如果设置上去的?我们在Activity把数据设置给了布局的user变量( 步骤4代码-->binding.setUser(user);),然后在布局中通过变量user设置到界面上去(比如名字:android:text="@{user.name}"),这就是Datading的基本使用。

还有一个需要注意的,User对象的属性如果是private就必需提供get()方法,在布局中才能访问到,如果是public的就不需要。

单向数据绑定

上面简单说明了Databinding的基础使用方法,现在我们说一下单向数据绑定
还是上面的例子,如果我们的数据改变了,应该怎样更新界面的数据呢?以前的做法应该是textview.setText(“content");通过手动去重新设置一次,现在我们使用Databinding就不用那么麻烦了。

  1. 首先对User对象进行修改,代码如下:
public class User extends BaseObservable {
    private String name;//名字
    private String intro;//简介

    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(org.zgc.aac.BR.name);
    }

    @Bindable
    public String getIntro() {
        return intro;
    }

    public void setIntro(String intro) {
        this.intro = intro;
        notifyPropertyChanged(org.zgc.aac.BR.intro);
    }
}

BaseObservable是什么呢,它可以通过Observable的方式去通知UI数据已经改变了,从需更新界面数据;
使用的3个步骤

  • 继承BaseObservable;
  • Getter添加注解@Bindable
  • Setter里面调用notifyPropertyChanged
    就是这么简单,当数据发生改变的时候,BaseObservable就会自动更新界面的数据。那我们在上面的例子添加一个添加靓仔按钮,点击一次就在名字后面添加"靓仔",关键代码如下:
private StringBuffer sb = new StringBuffer();
public void onClick(View view) {
    switch (view.getId()) {
          case R.id.btn_click:
              user.setName(user.getName() + "靓仔");
              break;
    }
}

运行看一下效果:


device-2019-10-23-223403[00_00_00--00_00_20].gif

可以看到我们改变User对象的属性,界面就会自动更新。

但是如果对象的属性很多,我们要添加的代码量就很大了,所以官方还提供了另一种方法,修改User对象,代码如下:

public class User {
    private ObservableField<String> name;//名字
    private ObservableField<String> intro;//简介

    //getter and setter
}

这样就比较简单了

Databinding为各种类型提供了包装类

8种基础数据的包装类

  • ObservableBoolean
  • ObservableByte
  • ObservableChar
  • ObservableDouble
  • ObservableFloat
  • ObservableInt
  • ObservableLong
  • ObservableShort

集合的包装类

  • ObservableArrayList
  • ObservableArrayMap

实现了Parcelable接口对象的包装类

  • ObservableParcelable

Object对象的包装类

  • ObservableField(比如上面例子中,使用String对象:ObservableField<String>)

双向数据绑定

上面说了单向的数据绑定,那如果我在界面中更改了数据,如果更新到对象中?
继续上面的例子,我们添加一个Editext控件,数据绑定为User.intro:关键代码如下:

<EditText
    android:id="@+id/tv_content_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="请输入你的简介"
    android:padding="10dp"
    android:text="@{user.intro}" />

运行一下看效果:

device-2019-10-23-232352[00_00_00--00_00_20].gif

这时候发现上面的TextView标签的内容并没有更改,其实我们只需要把EditText绑定方式加一个“=”就可以了,代码如下:

<EditText
    android:id="@+id/tv_content_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="请输入你的简介"
    android:padding="10dp"
    android:text="@={user.intro}" />

运行一下看效果:

device-2019-10-23-232840[00_00_01--00_00_08].gif

可以看到,在EditText更改内容后,上面的TextView也自动更改内容了。

事件绑定

在上面单向数据绑定,我们添加了一个按钮,现在我们说一下这个按钮是怎样和控件绑定的。

  1. 首页先添加一个类,里面有一个onClick(View view)方法(这个名字可自定义),关键代码如下:
public class Action {
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_click:
                user.getName().set(user.getName().get() + "靓仔");
                break;
        }
    }
}
  1. 在布局data元素添加一个variable元素
<variable
    name="action"
    type="org.zgc.aac.activity.ViewModelActivity.Action" />
  1. 添加一个按钮,关键代码如下:
<androidx.appcompat.widget.AppCompatButton
    android:id="@+id/btn_click"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="@{action::onClick}"
    android:text="click" />

通过android:onClick="@{action::onClick}"把按钮的单击事件响应绑定到onClick(View view)方法了。

到此Databinding的基础入门使用就讲完啦
示例代码托管在Github
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • Android DataBinding Data Binding Library 从 2015 Google I/...
    灰灰鸽阅读 2,903评论 0 7
  • 目录 一、MVVM和dataBinding介绍 二、初步使用 三、其他使用1. 事件处理2.viewstub和in...
    下位子阅读 4,429评论 6 19
  • 简介 DataBinding即数据绑定,是Google为Android提供的一种MVVM实现方式,目前也是Andr...
    三雒阅读 1,012评论 0 1
  • DataBinding 库是 Google 公司 Android Framework UI 工具团队开发出来的一款...
    bravian阅读 5,420评论 2 16
  • 2017.07.20 晴天,积跬步,至千里, 勤奋让时间开花结果,在今后的日子里要广招人才,多拜望,多签单,时刻想...
    dcbbb8c129a4阅读 163评论 0 0