Android:DataBinding的一二事

写在前面

最近冷静了一个星期,学了大名鼎鼎的DataBinding。导师说这跟H5一样,是未来Android发展的趋势。看了一下,确实是Google官方跟着MVVM一起推出来的,所以就学了相关的知识,个别也运用到项目中。

不过讲心里话,不知道是不是平时的findViewById用习惯了,还是ButterKnife太好用了,一直觉得用这样的方式去绑定数据有点浑身不得劲,先学着吧。

所以今天来分享一下学习DataBinding过程。不过不同的是,在这里我不介绍它的使用规范或者方法,因为目前网上关于DataBinding的优秀文章很多很多,文末也会有相关链接。

只不过由于大部分文章都是针对Gradle1.5版本去写的,有些方法和注意事项已经不适用了,而且文章几乎只分开介绍了基本使用,并没有介绍开发中的一些实际问题,我在学的过程中也踩了不少坑,所以本篇文章主要先介绍一下新版本的不同(坑),然后用一个小的实战项目来具体展示如何使用DataBinding。

站在前人的肩膀上,帮后人踩坑

初始配置

第一次使用的时候需要注意,Gradle版本需要大于1.5。如果大于1.5, 只需要在当前 Module 下的 build.gradle 文件中添加如下代码即可 :

android {

    ...

    dataBinding {

        enabled true

    }

    ...

}

注意,只需要在 android{ } 里面加省略号之间的三行就行了,其他啥都不用配置。在这里,我项目用的版本是 Gradle 2.1.3 。

使用注意事项

1、 android:text 中只能写” @{…}”的形式

在其他优秀DataBinding使用教程,我们学会了像下面这样的使用规范:

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="@{user.age}" />

但是千万不能这样写:

    ...

    android:text="年龄@{user.age}" />

 

    ...

    android:text="年龄+@{user.age}" />

对比一下吧,没有对比就没有伤害:

当然如果你这样写的话:

    ...

    android:text="@{年龄user.age}" />

 

    ...

    android:text="@{年龄+user.age}" />

压根编译都过不去,请珍惜生命,善待自己。

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

假如上面的 user.age 是 int 类型的话,一定要记得转成 String 类型,怎么转?当然是 String.valueOf() 了:

    ...

    android:text="@{String.valueOf(user.age)}" />

3、引用资源Bug已经被解决

在之前所有的文章中,都有提到 官方有个bug ,说在引用资源时必须加上 int 才能通过编译。

但是经过我的测试,不加也是可以编译且正常运行的,可能这个bug已经被解决掉了:

    ...

    android:text="@{person.name}"

    android:paddingLeft="@{person.isTrue ? @dimen/largeDP : @dimen/smallDP}"/>

    ...

    android:text="@{person.phone}"

    android:textSize="@{large ? @dimen/largeSP : @dimen/smallSP}" />

从下图可以看到,第一个行间距不同,第二行字号不同:

4、include不能添加在非根结点的ViewGroup中?

同样的,在之前几乎所有的教程中,说 include 标签不能非根结点的 ViewGroup 中,说程序会Crash掉,但是经过我的测试,程序也能正常编译运行,估计也是一个Bug吧:

    android:orientation="vertical">

    

        bind:user="@{user}" />

    

        bind:btClick="@{btClick}" />

    

    

        android:orientation="vertical">

        

            bind:user="@{user}" />

        

            bind:btClick="@{btClick}" />

    

如下图,布局是一样的:

以上两个Bug问题是仅在 有限测试 后得出的结论,如有错误请指正,谢谢!

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

什么意思呢,比如下面根据 large 的值引用不同资源/属性:

     android:visibility="@{large ? View.INVISIBLE : View.VISIBLE}"/>

    android:textColor="@{large ? Color.RED : Color.YELLOW}"/>

这个时候,我们用到了 View 包和 Color 包,所以必须在 data 标签中 import 这两个包,才能显示正常:

从下图可以看到第一行没有显示,第二行是红色的:

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

一般来说,编译器会给我们自动生成一个绑定类,类名与布局文件的名称一致。有些时候,我们需要自己自定义:

需要注意的是,这里 CustomBinding 之前的 * 号部分必须是项目的包名,那包名需要一直写到哪呢?

这个没有具体规定,比如我项目的目录是这样的:

|--com

    |--dataBinding

        |--adapter

        |--bean

        |--pojo

        |--ui

        |--utils

我可以写 com.databinding.CustomBinding 也可以写 com.databinding.ui.CustomBinding ,只要在项目包中即可。当然了,不能只写个 com.CustomBinding ,这是个细节问题,大家注意一下就好。

7、XML文件中不能包含< >符号

实际上这是个很有趣的问题,开始我还没有发现,先看下面这段代码:

    

    

        type="ObservableMap" />

这里的 variable 类型为一个 ObservableMap ,既然是 Map 当然就有 Key 和 Value ,这里是 String 类型的 Key ,Object 类型的 Value ,但是注意这里并不是你看错了,就是这么写的。因为这里不允许使用 “< >” 这样的格式,否则会直接报错。

8、IDE的各种问题

因为DataBinding推出不是很久,用的人不是很多,听说在早前的AS版本中,IDE是没有智能提示的。但是现在的IDE已经对DataBinding有了很好的支持了,但是仍然还是有很多小的问题。

比如在XML文件的UI层的根结点中,一些常用的属性没法提示,连 width 和 height 有时候都打不出来,但是如果真的手打出来的话,仍然是有效的,估计是IDE的问题。

同样的,有时候在Activity中想要得到绑定类的时候,总是提示没有这个类,但是绑定命名却跟XML文件命名一致的,这个时候我们只要把XML文件名称随便重命名一下就行了,估计也是IDE没有反应过来。

常见问题

1、xx missing it

Error:Execution failed for task ':DataBindingDemo:compileDebugJavaWithJavac'.

> java.lang.RuntimeException: Found data binding errors.****/ data binding error ****msg:Identifiers must have user defined types from the XML file. Color is missing it

file:D:\Android\AndroidProject\Android5.0Demo\DataBindingDemo\src\main\res\layout\activity_resource.xml

loc:120:45 - 120:49****\ data binding error ****

这个问题很常见,不过跟我上面说的第五点是一致的,大部分都是因为没有导包的原因,所以找不到这个 Color 。

解决办法就是一句话,什么Missing导什么。

2、Could not find method XX

这也是个细节性问题了,比如下面这段代码(有省略):

    type="android.view.View.OnClickListener" />

    ...

    

the end

评论(0)