JetPack学习笔记之DataBinding(一)
布局文件通常只负责UI控件的布局工作,页面通过setContentView()方法关联布局文件,然后通过View的id找到控件,然后才能在代码中对View进行操作。可以说页面(Activity或者Fragment)承担了大部分的工作量。DataBinding 的出现让布局文件承担了一部分原本属于页面的工作,也使得页面和布局文件的耦合度进一步降低了。
DataBinding的优势:
- 项目更简洁,可读性更高。部分与UI控件相关的工作可以在布局文件中完成。
- 不再需要findViewById()方法。
- 布局文件可以包含简单的业务逻辑。View可以直接与数据模型中的字段绑定,甚至能够响应用户的交互。
DataBinding与MVVM架构是分不开的,实际上,DataBinding是谷歌为了Android能更好地实现MVVM架构而设计的。
采用DataBinding完成简单的数据绑定
1、在app的build.gradle文件中启用数据绑定
android {
...
dataBinding {
enabled = true
}
}
2、将布局文件转换为data bind 布局,具体操作可以参照下图。
修改后的布局文件为
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".databinding.DataBindingActivity">
</LinearLayout>
</layout>
可以看到,在布局文件最外层添加了一个layout标签,而且将命名空间移到了layout标签上,data标签稍后会介绍。
此时rebuild项目,DataBinding库会自动生成为绑定布局文件所需要的类
3、建立数据对象
/**
* 项目名称 JetPackPro
* 创建人 xiaojinli
* 创建时间 2020/8/6 9:36 PM
**/
public class Book {
private String name;
private String title;
private String money;
public Book(String name, String title, String money) {
this.name = name;
this.title = title;
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
}
4、在布局文件中引入对象,绑定布局变量与数据模型中的成员变量
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="book"
type="com.example.jetpackpro.databinding.Book" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".databinding.DataBindingActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{book.name}"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{book.title}"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{book.money}"/>
</LinearLayout>
</layout>
5、 在页面中实例化布局文件
public class DataBindingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_data_binding);
ActivityDataBindingBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_data_binding);
Book book = new Book("这是书名","这是作者","20元");
binding.setBook(book);
}
}
运行后页面显示为:
6、在布局文件中对数据模型中的字段进行简单的映射。
布局文件中View显示值不只能简单的显示数据模型中的值,还可以借助外部类进行一些处理。比如我们生成一个处理金钱的类。
/**
* 项目名称 JetPackPro
* 创建人 xiaojinli
* 创建时间 2020/8/6 9:47 PM
**/
public class MoneyHelp {
public static String formatMoney(String money){
return money + "$";
}
}
在布局文件中引入该类,并修改显示金钱的View修改为:
<data>
...
<import type="com.example.jetpackpro.databinding.MoneyHelp"/>
</data>
...
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{MoneyHelp.formatMoney(book.money)}"/>
将Activity中初始化Book对象时的money修改为20,重新运行该项目: