DataBinding深入实战(一)-@BindingAdapter天马行空的binding

这2天正在编辑和整理之前的项目,稍后会把完整的binding例子工程整理好放到github上去。

本系列不是databinding的基础使用讲解,基础使用看官方文档就够了,这里是对于官方提供的所有基础功能挖掘,怎么样的能够利用它简化开发工作,发挥天马行空的想象力,同时也是抛砖引玉,启发大家发掘出各种用法。

Google官方的Databinding已经推出很久了,但是国内使用者其实还不多,有很大一部分原因是大家搜索到的教程,其实只是各个功能点最基础的应用,有些同学浅尝辄止的看过后会觉得:”其实没有方便多少嘛“。实际上,这个库目前来看,绝对不应该被看成是一个包装完全了的傻瓜式使用库,而应该把它看成是一个原材料,它提供给你了无限的可能,你要基于它各种强大的基础功能,发挥你的想象力才可能发现它的好用之处。

本篇介绍的是其中的一个知识点,由浅入深介绍几个在自己工程实践中突发奇想的一些用法。

一. @BindingAdapter 介绍

我们在xml中会给view添加各种属性,比如 textSize = xxx。databinding库为我们提供了一种方法,就是扩展view控件的xml属性,而且使用起来非常简单,就是在你的项目里写一个类,然后根据每一个属性写一个方法,使用@BindingAdapter告诉databinding框架这个方法就是用来自定义属性的。

1。简单应用,view动态控制:

自定义属性

如上图,我们写了一个方法,public static void imageSrc(ImageView view, int resId) 用这个方法来给ImageView控件添加一个xml属性:imageSrc(通过注解@BindingAdapter来指定这个属性在xml里应该叫什么)。 这样在xml里我们就可以利用这个属性来给imageView来添加图片。

xml中使用方式如下:

我们来看imageView的最后一行, android:imageSrc="@{menuBean.src()}" 就是我们上面自定义的方法。这个menuBean 是我们在当前xml页面绑定的一个数据对象。这样一来,我们就可以调用这个对象的一个方法:src() 来给iageView指定图片。

如果你要问,这样做的意义何在?imageView自己就有设置图片的方法啊。

我们考虑如下情况,一个imageView,图片不是固定的,比如根据用户级别来显示不同图片。这样一来,我们自定义这个属性就派上用场了,从服务端获取到用户数据后,我们在menuBean内部就可以计算判断出当前应该显示的图片是什么,并且赋值给这个成员变量。这样进入页面的时imageview就会显示我们想要的图片。

而我们不在需要代码中写mageView的resource控制,而通常要控制一个view,我们都需要在activity都代码中来写,这就意味这这段代码既要引用到view,又要引用到数据data对象,不符合代码低耦合的观点。而用这种方式以后,data对象里不需要知道view的存在,activity里也不需要去代码让这2者关联,而是成功的转到了xml中的一条属性。

src方法如下:

类似的可以有很多场景,比如网络图片的url,文字背景色切换等等。发挥你的想象力,把代码中view和data关联的逻辑代码解放出来把。


2.创造属性实现多个view之间的观察者模式

现在大家都开始喜欢响应式编程,基于java内置都观察者api,我们平时也可以转变思维来多用响应式。

例子:比如一个editText,有需求这个edittext获取焦点,正在编辑都时候,页面上其他的一些view要跟着有变化。最直接的做法就是我们在代码里写editText的监听事件,然后在找到各个需要处理的view,去代码控制他们改变。而通常这一战场又出现在activity里,只有这里才是view 门的聚会场所···。

现在我们改变下思路,不去主动的控制这些view,而让这些view去响应改变,EditText作为obervable被观察,需要响应改变的views作为observer,当观察到editText在编辑状态时,则作出自己的响应。

举例:

(1)自定义类继承EditText,在获取焦点时候,像其他的view发出消息通知。

(2) 自定义响应的view 实现Observer接口,文中以textView举例:update方法会自动响应observable对象发出的消息。

(3)用@BindingAdapter创建方法将二者联系起来。

如上,我们可以对这个自定义的EditText扩展一个xml属性:observer,像其注册观察者。这样我们就可以把2者的链接互动通过一条xml属性就完成,而不需要在去写任何的代码:

就是这样,我们只要一个xml属性,就像这个editText注册了一个TextView作为观察者,当edit被编辑时候,这个textView会自动进入selected状态。


3.自定义属性接管listview adapter创建,从此不再写adapter

---未完待续---

你可能感兴趣的:(DataBinding深入实战(一)-@BindingAdapter天马行空的binding)