android数据绑定之Data Binding

来源:互联网 发布:骑士队球员数据 编辑:程序博客网 时间:2024/05/17 18:48

(1)工具:

      Android studio 1.3.0或更高


(2)在build.gradle中引入:

      例如:

    android {        ......        dataBinding {            enabled = true        }    } 


(3)数据对象

Sample可以是plain-old Java object(POJO) 对象或者JavaBean对象。

package com.pdm.alina.myactivityanimation.bean;public class Sample implements Serializable {    private final int color;    private final String name;    public Sample(@ColorRes int color, String name) {        this.color = color;        this.name = name;    }    @BindingAdapter("bind:colorTint")    public static void setColorTint(ImageView view, @ColorRes int color) {        DrawableCompat.setTint(view.getDrawable(), color);    }    public String getName() {        return name;    }    public int getColor() {        return color;    }}

这里使用@BindingAdapter("bind:colorTint")注解静态绑定适配器方法,为下文中sample_test.xml的app:colorTint属性自定义setter方法,即setColorTint().

Binding适配器对其他定制类型非常有用,例如:自定义loader可以用来异步加载图像,当有冲突时自定义的Binding适配器将覆盖Data Binding默认适配器。


(4) 在xml文件中使用Data Binding

    例如:sample_test.xml

<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools">    <data>        <variable            name="sample"            type="com.pdm.alina.myactivityanimation.bean.Sample" />    </data>    <LinearLayout        android:id="@+id/sample_layout"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center_vertical"        android:orientation="horizontal"        android:padding="@dimen/spacing_double">        <ImageView            android:id="@+id/sample_icon"            android:src="@drawable/circle_24dp"            app:colorTint="@{sample.color}"/>        <TextView            android:id="@+id/sample_name"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{sample.name}"            tools:text="View animations sample"/>    </LinearLayout></layout>


Data Binding的Layout与普通的Layout的区别在于:根标签为<layout>,接下来是一个<data>标签,然后是view元素。在<data>中描述了一个名为sample的属性,即为com.pdm.alina.myactivityanimation.bean包下的Sample实体:

<variable    name="sample"    type="com.pdm.alina.myactivityanimation.bean.Sample" />


使用@{sample.~}进行Sample对象的属性值读取设置:

<ImageView      android:id="@+id/sample_icon"      style="@style/MaterialAnimations.Icon.Small"      android:src="@drawable/circle_24dp"      app:colorTint="@{sample.color}"/>

sample_test.xml默认对应生成一个SampleTestBinding类(与xml文件的名字一致,即xml名字+Binding),这个类继承ViewDataBinding类,包含了不仅文件中所有的绑定关系。
(如果<data class="BindNameTest">中设置了Binding类名称,则生成BindNameTest的Binding类)


(5)数据绑定
在inflate的时候创建binding:
protected void onCreate(@Nullable Bundle savedInstanceState) {......SampleTestBinding binding = DataBindingUtil.setContentView(this, R.layout.sample_test);Sample sample = (Sample) getIntent().getExtras().getSerializable("...");binding.setSample(sample);// set方法和sample_test.xml布局中variable的名称改对应}

binding的获取还可以通过如下方法:
SampleTestBinding binding = SampleTestBinding.inflate(getLayoutInflater())


(6)事件处理
有两种方法:方法调用和监听绑定

方法调用:表达式会在编译时处理,如果函数不存在或者函数签名吗不对,编译将会报错。
例如(参考上面提到的Sample类代码):

public class Sample1 {       ......       public void onClickTest(View view) {             .........      }}

表达式如下(以sample_test.xml)为基础:
<ImageView      android:id="@+id/sample_icon"      android:src="@drawable/circle_24dp"      app:colorTint="@{sample.color}"      android:onClick="@{sample::onClickTest}"       // 此时sample属于Sample1/>

监听绑定:
public class Sample2 {       ......       public void onTaskClickTest(Sample2 sample2) {             .........      }}

表达式如下:
<ImageView      android:id="@+id/sample_icon"      android:src="@drawable/circle_24dp"      app:colorTint="@{sample.color}"      android:onClick="@{()->sample.onTaskClickTest(sample)}"   // 此时sample属于Sample2      />