您的位置:首页 > 移动开发 > Android开发

android数据绑定之Data Binding

2017-08-25 14:52 471 查看
(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
/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: