美文网首页android技术专栏
DataBinding 学习系列(4)DataBinding的高

DataBinding 学习系列(4)DataBinding的高

作者: 珠穆朗玛小王子 | 来源:发表于2017-09-12 16:39 被阅读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的神奇。

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

    相关文章

      网友评论

        本文标题:DataBinding 学习系列(4)DataBinding的高

        本文链接:https://www.haomeiwen.com/subject/oqncsxtx.html