DataBinding的用法介绍
DataBinding是Google 发布的一个数据绑定框架,它能够让开发者减少重复性非常高的代码,如findViewById 这样的操作。其核心优势是解决了数据分解映射到各个view的问题,在MVVM框架中,实现的View和Viewmode的双向数据绑定。
用法案列
1.在Module的build.gradle android模块中添加如下配置
android {
dataBinding {
enabled = true
}
}
2.创建数据模型,比如一个简单的JavaBean对象
public class UserBean {
private String name;
private int age;
public UserBean(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3.创建绑定数据的视图xml文件
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.databinding_demo.UserBean"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
<!-- age 是int类型,需要转化为String-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(user.age)}"/>
</LinearLayout>
</layout>
这里我们使用Layout作为根节点,里面包含了data节点和布局文件,这里的data节点是连接View与Modle的通道,在data中声明variable变量,配置Bean对象,这样我们就可以在xml中通过@{}方法直接使用变量的数据。括号中直接引用Bean对象的属性完成赋值,注意这里的类型转换为String类型。
4.Activity中布局引入和赋值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
UserBean bean = new UserBean("zhangsan",30);
binding.setUser(bean);
}
这里用DataBindingUtil.setContentView代替了setContentView,然后创建一个 UserBean 对象,通过 binding.setUser(userBean) 与 variable 进行绑定。
注意:这个ActivityMainBinding 是继承ViewDataBinding,这个类的生成是有规则的,它是根据对应的布局文件的名字生成的,比如:activity_main–>ActivityMainBinding 、fragment–>FragmentBinding即:第一个单词首字母大写,第二个单词首字母大写,最后都会拼上Binding就是生成的Binding类。
DataBinding 绑定的数据除了Bean对象外,还可以是Java中的任意数据类型,比如基础数据类型,List,map,数组等
<data>
<variable
name="str"
type="String"/>
<variable
name="age"
type="int" />
<import type="java.util.List" />
<import type="java.util.Map" />
<variable
name="list"
type="List<String>" />
<variable
name="map"
type="Map<String,Object>" />
<variable
name="array"
type="String[]" />
</data>
注意,如果这里的泛型支持报红线,或者编译不过,请使用转义字符代替,如 :
赋值方法如下:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{list[0]}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{list.get(1)}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@{map[`key0`]}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{map.get(`key1`)}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@{array[0]}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{array[1]}" />
</LinearLayout>
数据的初始化:
List<String> list = new ArrayList<>();
list.add("list01");
list.add("list02");
binding.setList(list);
HashMap<String, Object> map = new HashMap<>();
map.put("key0", "value01");
map.put("key1", "value01");
binding.setMap(map);
String[] arrays = {"字符串1", "字符串2"};
binding.setArray(arrays);
此文仅作为学习笔记,记录DataBinding的用法
博客参考:https://www.jianshu.com/p/70316eb4e0f8