1.开启
dataBinding{
enabled=true
}
2.布局和Bean
创建普通布局后,鼠标选中根布局,alt+enter 提示,convert to DataBinding模式,就会如下结构:
data 主要负责描述bean对象。下面是布局结构对象
import导入bean对象的路径
varable 变量标签
name 变量名字
type 变量类型
都很简单,好理解。
<?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 >
<import type="com.example.testjetpack.User"/>
<import type="com.example.testjetpack.ObserveUser"/>
<variable
name="user"
type="User" />
<variable
name="user"
type="ObserveUser" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:textSize="33sp"
android:layout_height="wrap_content"
android:text="@{user.name,default=www}"
tools:ignore="MissingConstraints" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={user.name}"
/>
</LinearLayout>
</layout>
3.代码-主界面
代码如何这种结构的xml结构进行关联
布局文件转换为DataBinding的模式后,都会产生一个DataBinding类。规则是布局名称+DataBinding,如activity_main 就会产生ActivityMainBinding.忽略特殊字符。
// 第一种方式
ActivityMainBinding binding = DataBindingUtil.setContentView(this,
R.layout.activity_main);
//第二种方式
ActivityMainBinding inflate = ActivityMainBinding.inflate(getLayoutInflater());
4.单向数据变化更新UI
4.1 实体类继承
改变数据后,调用 notifyChange(); 更新所有字段
notifyPropertyChanged(BR._all); 更新单个字段。
public class User extends BaseObservable {
private String id;
private String name;
...set方法
...get方法
public void setName(String name) {
this.name = name;
notifyChange(); //更新所有字段
notifyPropertyChanged(BR._all);
}
5.双向绑定
就是数据变化可以通知UI,UI的变化也会更新数据。
最重要的是 android:text="@={user.name}" 多了=符号。
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={user.name}"
/>