浅谈|浅谈 Android DataBinding

因为最近写了了MVVM框架的使用,有兴趣的朋友看看这里谈谈Android框架 MVC、MVP、MVVM的区,用到了DataBinding,所以今天写写它的介绍。
一、什么是DataBinding以及它的发展历程 DataBinding是一个用来解决界面逻辑的Android数据绑定框架,由去年谷歌 I/O大会上随同MVVM框架一同推出。
浅谈|浅谈 Android DataBinding
文章图片
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的使用如下图所示:
浅谈|浅谈 Android 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 是类型的变量,然后把它跟布局文件中声明的变量进行绑定。

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 中只能写" @{...}"的形式
输出:黄海佳

不能这样写:
输出:姓名@{user.name}

不能这样写:
输出:姓名+@{user.name}

2.注意 android:text 中是 String 类型 假如值 user.id 是 int 类型的话,一定要记得转成 String 类型(String.valueOf())

3.属性的使用(可用表达式):

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; } }


5.使用资源或者属性时,记得引包 因为用了View属性和Color属性,需要引入包。

6.自定义绑定类名称注意包名 如果项目结构如下
|--com |--dataBinding |--adapter |--ui |--CustomView |--adapter

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

7.XML文件中不能包含< >符号 如果你的项目里面有用到 "< >" 这样的格式,需要转移一下,例如"<"写成"<"

7.Null Coalescing 运算符
android:text="@{user.displayName ?? user.lastName}"android:text="@{user.displayName != null ? user.displayName : user.lastName}"

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

【浅谈|浅谈 Android DataBinding】暂时就写这些,后面有机会深入研究再分享

    推荐阅读