Android Data Binding

  对于绑定方式处理关联数据,我个人其实并不是太喜欢,即使Google官方放出Android Data Binding已经很久了,我只是大概的去做了一下了解,并没有刻意去深入学习实践过。但是在我想去了解学习MVVM模型的时候,貌似是要必须过这个坎儿。所以这里记录一下Android Data Binding的基本使用方法。(其实,记录这篇文章的时候,我已经觉得这个东西,其实用起来还是很爽的……)

环境配置

  • Android Studio (version >= 1.3)
  • Project build.gradle
1
2
3
4
5
6
7
dependencies {
//keep gradle & dataBinder version is latest
classpath 'com.android.tools.build:gradle:1.3.+'
classpath 'com.android.databinding:dataBinder:1.+'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
  • Module build.gradle
1
2
3
apply plugin: 'com.android.application'
//add the databinding plugin
apply plugin: 'com.android.databinding'

Layout布局文件

  • 基本形式:
1
2
3
4
5
6
7
8
9
10
<!--根节点为layout-->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<!--新增节点data-->
</data>
<!--原布局根节点(Root Element)-->
<RelativeLayout>
....
</RelativeLayout>
</layout>
  • 实践Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto"
>

<!--class用来自定义自动生成的Binding类名,没有class会默认生成和类名类似的binding,eg. ActivityMainBinding-->
<data class="MainBinding">
<!--alias可以用来区分同名的类-->
<import alias="CoderA" type="me.onez.databinding.model.Coder" />
<import type="me.onez.databinding.model.CoderPro1" />
<import type="me.onez.databinding.model.CoderPro2" />

<!--会自动生成相应的setter eg. binding.setCoder()-->
<variable name="coder" type="CoderA" />
<variable name="coderPro1" type="CoderPro1" />
<variable name="coderPro2" type="CoderPro2" />
</data>

<RelativeLayout>
....
<!--bind基本属性-->
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="@{coder.name}"
android:textColor="@android:color/background_dark"
android:textSize="20sp"
/>


<!--bind点击事件-->
<Button
android:id="@+id/btn_click_binding"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_above="@id/btn_test"
android:text="Click binding"
bind:onClickListener="@{coderPro2.onClickListener}"
/>


</RelativeLayout>

详细layout文件参考 activity_main.xml

Activity中的使用

See Code Below:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends AppCompatActivity {

@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//用 DatabindingUtil.setContentView() 来替换掉 setContentView()
// 然后创建一个相应XXX对象,通过 binding.setXXX(xxx) 与 variable 进行绑定。
final MainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

final Coder coder = new Coder();
binding.setCoder(coder);

final CoderPro1 coderPro1 = new CoderPro1();
binding.setCoderPro1(coderPro1);

final CoderPro2 coderPro2 = new CoderPro2();
binding.setCoderPro2(coderPro2);
}

详细Activity文件参考 MainActivity

Data Binding Demo

DataBinding On My Github

资料参考

MasteringAndroidDataBinding

Data Binding 用户指南(Android)