android技术专栏

DataBinding 学习系列(4)DataBinding的高

2017-09-12  本文已影响0人  珠穆朗玛小王子

前言#

前几篇已经DataBinding的基础用法已经介绍的差不多了,所以接下来感受一下DataBinding强大的高级功能。

正文#

DataBinding可以通过注解,实现很多强大的功能,并且十分的方便,能够帮助我们省去大量的对xml进行操作的代码,例如加载图片,字符串处理等等操作。

<h2>@BindingConversion 自定义类型转换</h2>

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@{@string/app_name}"/>
    
@BindingConversion
public static Drawable convertStringToDrawable(String str){
    return new ColorDrawable(Color.parseColor("#344567"));
}

分析上面的代码,在xml中设置ImageView的背景是@{@string/app_name},里面设置的竟然是字符串,如果是正常使用因为属性类型不匹配,肯定是要报错的,但是利用了@BindingConversion,就可以帮助我们实现默认的类型转换。

从功能上看,我们需要把一个String类型转换成Drawable类型,所以在任意的工具类中,创建一个以参数为String类型,返回值为Drawable类型的方法,最关键是的是别忘了@BindingConversion注解,帮助我们与DataBinding进行绑定,DataBinding会自动在绑定的方法中找到符合要求的方法进行转换。

<h2>自动添加Setter方法</h2>

在定义对象(Bean)中,最常见的就是Setter和Getter方法,DataBinding可以帮助我们为自定义属性自动设置Setter方法。

首先,DataBinding一个不得不说的强大之处,不需要在styleable-declare中声明就可以使用他需要的自定义属性,使用方法和平常的自定义属性一样,只需要在root标签中,定义命名空间。

先看代码:

<ImageView
    android:layout_width="200dp"
    android:layout_height="200dp"
    app:imageDrawable="@{@drawable/ic_launcher}"
    android:background="@{@string/app_name}"/>

在xml中使用了一个从来没见过的imageDrawable属性,但是不会报错,运行结果看图:


这里写图片描述

ImageView显示了@drawable/ic_launcher 对应的图片,这是为什么呢?

因为DataBinding会自动为imageDrawable在ImageView中寻找对应的setter方法,也就是setImageDrawable(),如果这个方法不存在肯定就要报错了。其他的属性也可以通过同样的方式来直接在xml中设置想要的属性值。

<h2>重命名setter 方法 @BindingMethods</h2>

@BindingMethods({
@BindingMethod(type = "android.widget.ImageView",
attribute = "android:tint",
method = "setImageTintList"),
})

ImageView在xml 中的android:tint 属性 和setImageTintList()是相对应的,但是在方法命名上并不是符合Setter的规则,这样就可以利用@BindingMethods 来重命名对应的setter方法。

特别注意,这一句需要加载类的最上面,在import 下面。

上面这个例子是系统自带的,个人感觉实战中可能接触的并不多。

<h2>自定义setter方法@BindingAdapte</h2>

个人感觉这个功能应该是用的最多的,通过@BindingAdapte就可以直接为自定义属性定制自己的实现方法。

<ImageView
    android:layout_width="200dp"
    android:layout_height="200dp"
    app:image="@{@drawable/ic_launcher}"
    android:background="@{@string/app_name}"/>

@BindingAdapter("bind:image")
public static void loadImage(ImageView image, Drawable resId){
    image.setImageDrawable(resId);
}

首先在工具类中创建一个setter方法,这个方法至少需要一个参数,就是View本身,然后绑定自定义属性。

上面的loadImage方法,绑定的是image属性,其中绑定的格式就是 “bind:xxx”, 如果要绑定多个属性,之间用英文的逗号隔开,例如@BindingAdapter("bind:image" , "bind:test" ),在xml如果需要使用这个方法直接在指定的View设置image属性。

<h2>设置View上属性默认值</h2>

大部分我们想在ide中预览效果,例如看看textView的位置,文字颜色大小等是否满意,但是使用了DataBinding个就会变得不方便,所以DataBinding直接提供了设置默认值的功能

<TextView android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@{user.firstName, default=test}"/>

语法就是在完整的属性值最后用英文的逗号隔开, 加上default=xxxx, 注意这个默认值是不能加上引号的。

特别注意:经过测试,目前DataBinding暂不支持使用@mipmap下的图片。

总结#

介绍到这里,DataBinding的各种功能的使用就算是圆满的结束了,代码也非常的简单,但是一定要自己亲自在电脑上敲一敲才能感受到DataBinding的神奇。

下一篇准备写一写还有哪些知识点没有介绍到,再好好的深化一下概念。

上一篇下一篇

猜你喜欢

热点阅读