概述
Data Binding,顾名思义,数据绑定,是Google对MVVM在Android上的一种实现,可以直接绑定数据到xml中,并实现自动刷新。现在最新的版本还支持双向绑定,尽管使用场景不是那么多。
Data Binding可以提升开发效率(节省很多以往需要手写的java代码),性能高(甚至超越手写代码),功能强(强大的表达式支持)。
1、Data Binding 如何使用 ?
1.1 环境配置
首先,你需要满足条件:
需要android studio1.3版本及以上
你的Android Plugin for Gradle版本必须等于或高于1.5.0-alpha1版本
接着,你必须告诉编译器开启Data Binding , 即在app build.gradle文件中的android 节点添加:
android {
....
dataBinding {
enabled = true
}
}
1.2 基础知识
布局文件
使用 Data Binding 之后,xml 的布局文件就不再用于单纯地展示 UI 元素,还需要定义 UI 元素用到的变量。所以,它的根节点不再是一个 ViewGroup,而是变成了 layout,并且新增了一个节点 data。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 在data内描述了一个名为user的变量属性,使其可以在这个layout中使用: -->
<data>
<variable
name="user"
type="com.demo.databinding.bean.User"/>
<variable
name="aboutus"
type="String"/>
</data>
<!--原先的根节点(Root Element)-->
<LinearLayout
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/activity_horizontal_margin"
tools:context="com.demo.databinding.MainActivity">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{"" + user.age}'/>
</LinearLayout>
</layout>
定义 Variable
回到布局文件,在 data节点中声明一个 User类型的变量 user。
<!-- 在data内描述了一个名为user的变量属性,使其可以在这个layout中使用: -->
<data>
<variable name="user" type="com.demo.databinding.bean.User"/>
</data>
其中 type属性就是我们在 Java 文件中定义的 User类。
当然,data节点也支持 import,所以上面的代码可以换一种形式来写。
<data>
<import type="com.demo.databinding.bean.User" />
<variable name="user" type="User" />
</data>
后我们刚才在 build.gradle 中添加的那个插件 - com.android.databinding会根据 xml 文件的称 Generate 一个继承自ViewDataBinding 的类。 当然,IDE 中看不到这个文件,需要手动去 build 目录下找。
例如,这里 xml 的文件名叫 activity_main.xml,那么生成的类就是 ActivityMainBinding
。
注意
java.lang.*
包中的类会被自动导入,可以直接使用,例如要定义一个 String类型的变量:
<variable name="firstName" type="String" />
绑定 Variable
修改MainActivity的 onCreate方法,用 DatabindingUtil.setContentView() 来替换掉 setContentView(),然后创建一个 user 对象,通过 binding.setUser(user)与 variable进行绑定。
public class MainActivity extends AppCompatActivity {
/**
* ActivityMainBinding 是自动生成的, 命名规则是, 布局文件名称 + binding ,遵循驼峰命名法
*
*/
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("KAKA",29);
binding.setUser(user);
binding.setAboutus("关于我们");
binding.tvAboutus.setVisibility(View.VISIBLE);
}
}
除了使用框架自动生成的 ActivityBasicBinding,我们也可以通过如下方式自定义类名。
<data class="com.example.CustomBinding"></data>
注意
ActivityBasicBinding类是自动生成的,所有的 set方法也是根据 variable名称生成的。例如,我们定义了两个变量。
<data>
<variable name="firstName" type="String" />
<variable name="lastName" type="String" />
</data>
那么就会生成对应的两个 set 方法。
setFirstName(String firstName);
setLastName(String lastName);
使用 Variable
数据与 Variable 绑定之后,xml 的 UI 元素就可以直接使用了。
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
至此,一个简单的数据绑定就完成了。
1.3 高级使用
事件绑定
严格意义上来说,事件绑定也是一种变量绑定。我们可以在xml中直接绑定
android:onClick
android:onLongClick
android:onTextChanged
方法引用
通常会在java代码中定义一个名为Handler或者Presenter的类,然后set进来,方法签名需和对应listener方法一致。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 在data内描述了一个名为user的变量属性,使其可以在这个layout中使用:-->
<data>
<variable name="user" type="com.demo.databinding.bean.User"/>
<variable name="aboutus" type="String"/>
<variable
name="presenter"
type="com.demo.databinding.MainActivity.Presenter"/>
</data>
<!-- class 自定义 名称
<data class = "CustomName">
<import type="com.demo.databinding.bean.User" />
<variable name="user" type="User" />
</data>-->
<LinearLayout
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/activity_horizontal_margin"
tools:context="com.demo.databinding.MainActivity">
<TextView
android:id="@+id/tv_aboutus"
android:onClick="@{presenter.onClick}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{aboutus}'/>
</LinearLayout>
</layout>
在Activity 中
public class MainActivity extends AppCompatActivity {
/**
* ActivityMainBinding 是自动生成的, 命名规则是, 布局文件名称 + binding ,遵循驼峰命名法
*
*/
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("KAKA",29);
// binding.setUser(user);
// 或者直接通过setVariable
binding.setVariable(BR.user,user);
binding.setPresenter(new Presenter());
binding.setAboutus("关于我们");
binding.tvAboutus.setVisibility(View.VISIBLE);
}
public class Presenter{
public void onClick(View view) {
Toast.makeText(MainActivity.this, "点击事件...", Toast.LENGTH_SHORT).show();
}
}
}
2. 使用Data Binding有什么好处
3. 使用后 有什么弊端
4. 工作流程及原理
4.1 工作流程
4.1.1
Data Binding 做的第一件事就是进入并处理您的布局文件,其中的“进入”指的是,在你的程序代码正在被编译的过程中,它会找出布局文件中所有关于它的内容,获取到它所需要的信息,然后删掉它们,删掉它们的原因是如果继续存着视图系统并不认得它们。
4.1.2 第二步骤就是通过语法来解析这些表达式,例如:
<TextView android:visibility="@user.isAdmin ? View.VISIBLE : View.GONE}"/>
4.1.3
第三步就是在你代码编译过程中解决相关依赖问题。在这一步中,例如,我们看一下 user.isAdmin,想:“这是在运行时获取到 User 类对象中的一个布尔值。”
4.1.4
最后一步就是 Data Binding 会自动生成一些你不需要再写的类文件,总之到这里你只要享受它带来的好处💰就是了。
参考文章
1、Data Binding(数据绑定)用户指南
2、棉花糖给 Android 带来的 Data Bindings(数据绑定库)
3、Android Data Binding从抵触到爱不释手
4、Android官方数据绑定框架DataBinding
5、QQ音乐技术团队分享 — Android DataBinding 数据绑定
6、精通 Android Data Binding
7、从零开始的Android新项目7 - Data Binding入门篇