浅谈 Android DataBinding

因为最近写了了MVVM框架的使用,有兴趣的朋友看看这里谈谈Android框架 MVC、MVP、MVVM的区,用到了DataBinding,所以今天写写它的介绍。

一、什么是DataBinding以及它的发展历程

DataBinding是一个用来解决界面逻辑的Android数据绑定框架,由去年谷歌 I/O大会上随同MVVM框架一同推出。

Paste_Image.png
二、使用DataBinding有什么好处

对于每个Android开发人员来说,每个Activity的findViewById是一种重复、费力且傻瓜式的操作。于是有了很多注解框架来解决这一类问题,如(ButterKnife、Dagger),但是View层的数据解析还是要写。而DataBinding不仅解决了findViewById的重复操作,它的数据解析更是在XML层上解决,因此如果我们使用DataBinding,数据解析就会更快,这也是官网文档说DataBinding能提高解析XML的速度原因。并且使用DataBinding,你会发现代码真的是省了很多,同时它配合MVVM框架的使用更是比MVP框架提高了提高可维护性(解决了MVP大量的手动View和Model同步的问题,提供双向绑定机制)。同时它没有空指针的问题。

三、DataBinding缺点

1.复杂的布局处理起来很困难
2.IDE不够完善

四、如何使用DataBinding

DataBinding的使用如下图所示:

Paste_Image.png

在Module的build.gradle中添加下面代码,注意的是保证Gradle插件版本不低于1.5.0-alpha1

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    ...
    dataBinding {
        enabled true//添加这个
    }
}

activity_main
其中 type 属性就是我们在 Java 文件中定义的 User 类。而 name中的User 是类型的变量,然后把它跟布局文件中声明的变量进行绑定。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <import type="com.haijia.mvvp.bean.User" />

        <variable
            name="user"
            type="User" />

    </data>

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

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.id)}" />

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


    </LinearLayout>

</layout>

MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setUser(new User(123,"黄海佳"));
    }
}

就是这么简单就搞定了MVVM的框架,但是这里面有很多细节,下面我们谈谈这些细节。

六、注意细节
1. android:text 中只能写" @{...}"的形式
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.name}" />

输出:黄海佳

不能这样写:

<TextView
    ...
    android:text="姓名@{user.name}" />

输出:姓名@{user.name}

不能这样写:


<TextView
    ...
    android:text="姓名+@{user.name}" />

输出:姓名+@{user.name}

2.注意 android:text 中是 String 类型

假如值 user.id 是 int 类型的话,一定要记得转成 String 类型(String.valueOf())

<TextView
    ...
    android:text="@{String.valueOf(user.id)}" />
3.属性的使用(可用表达式):
<TextView
    ...
    android:text="@{user.name}"
    android:marginTop="@{true ? @dimen/largeMargin : @dimen/smallMartin}"/>

4.属性的使用(可使用外部静态方法):

如你有一个工具类的方法

public class MyStringUtils {
    public static String capitalize(final String word) {
        if (word.length() > 1) {
            return String.valueOf(word.charAt(0)).toUpperCase() + word.substring(1);
        }
        return word;
    }
}
<!--导入类-->
<import type="android.databinding.utils.MyStringUtils" />
<TextView
    ...
    android:text="@{StringUtils.capitalize(user.name)}"
    android:marginTop="@{1>0? @dimen/largeMargin : @dimen/smallMartin}"/>

5.使用资源或者属性时,记得引包

因为用了View属性和Color属性,需要引入包。

<import type="android.view.View" />
<import type="android.graphics.Color"/>
<!--显示-->
<TextView
    ...
     android:visibility="@{true? View.INVISIBLE : View.VISIBLE}"/>

<!--颜色-->
<TextView
    ...
    android:textColor="@{true? Color.RED : Color.YELLOW}"/>

6.自定义绑定类名称注意包名

如果项目结构如下

|--com
    |--dataBinding
        |--adapter
        |--ui
            |--CustomView
        |--adapter

那么引入包,我们可以写 com.databinding.CustomView也可以写 com.databinding.ui.CustomView,只要在项目包中即可。

<import class="com.databinding.CustomView" />
<import class="com.databinding.ui.CustomView" />
7.XML文件中不能包含< >符号

如果你的项目里面有用到 "< >" 这样的格式,需要转移一下,例如"<"写成"<"

 <!--错误写法-->
<data>
    <import type="android.databinding.ObservableMap" />
    <variable
        name="muser"
        type="ObservableMap<String, Object>" />
</data>


<!--正确写法-->
<data>
    <import type="android.databinding.ObservableMap" />
    <variable
        name="muser"
        type="ObservableMap<String, Object>" />
</data>
7.Null Coalescing 运算符
 <!--写法1-->
android:text="@{user.displayName ?? user.lastName}"


<!--写法2-->
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
8.类型别名

如果我们在 data 节点了导入了两个同名的类怎么办?为导入的类添加别名即可

<import type="com.databinding.bean.User" />
<import type="com.databinding.data.User" alias="DetailUser" />
<variable name="user" type="DetailUser" />

暂时就写这些,后面有机会深入研究再分享

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,892评论 25 707
  • 一个刚入行半年的菜鸟安卓开发人员,始终有一颗不安分的心。mvvm框架是我在学习vue的时候才知道的一种新型架构。公...
    sakasa阅读 4,250评论 5 22
  • 看看超市卖的杂粮里面的百合。用二氧化硫检测管测试显示高度含硫。前几天去沃尔玛超市买东西,顺便买了一袋绿豆百合粥,今...
    戊阳子阅读 1,535评论 0 0
  • 迷茫,似乎是生活的常态,尤其对二十岁左右的人。 上学的时候,不知道毕业能做什么,迷茫;临毕业,不知道找什么工作,迷...
    凌昭阅读 1,332评论 1 5
  • 王大姐的跑城,虽然我没有看到过,可是大家可以从她的表情,动作中看出姐姐的功力非浅。 清风亭中的王大姐 生活中的王大...
    丁旺新阅读 896评论 0 2