DataBinding(一)
准备
再Module下的build.gradle中添加如下:
android{
dataBinding{
enabled = true
}
}
1. 基础
在布局文件中,选中跟布局的ViewGroup,按住alt+回车键,点击“Convert to data binding layout”
由一个layout标签将原布局包裹,data标签用于声明要用到的变量及变量类型。
<data>
<variable
name="" //用于在布局文件中引用
type="" //类的完整包名 />
</data>
如果需要引用多个,可用import导入
<data>
<import type=""//类的完整包名/>
<variable
name=""
type=""/>
</data>
若用import导入的类名相同,可用 alias 指定别名
若布局文件名为activity_main.xml,则会自动生成一个ActivityMainDataBinding类,在onCreate方法中,用 ActivityMainDataBinding binding = DataBindingUtil.setContentView()
替换setContentView()
方法。
每个数据绑定布局文件都会生成一个绑定类即activity_main.xml会生成一个ActivityMainDataBinding类。
也可以用如下方式自定义类名
<data class="">
</data>
2. 单向数据绑定
实现数据变化自动驱动UI刷新的方式有三种
1. BaseObservable
提供了notifyChange()和notifyPropertyChanged()方法,前者会刷新所有值,后者则只会书信对应的BR的值。BR通过@Bindable注解
- 如果是public修饰的成员变量,则直接在成员变量的上方添加注解@Bindable
- 如果是private修饰的成员变量,则在其get方法上添加注解@Bindable
2. ObservableField
ObservableField可以理解为官方对BaseObservable中的字段的注解和刷新等操作的封装,官方原生提供了对数据类型的封装。例如:ObservableBoolean,ObservableByte…,也可通过ObservableField泛型声明其他类型。
3. ObservableCollection
提供包装类用于替代原生的List和Map,分别是ObservableList和ObservableMap,当其包含的数据发生变化时,绑定的视图随之更新。
<data>
<import type="android.databinding.ObservableList"/>
<import type="android.databinding.ObservableMap"/>
<variable
name = "list"
type="ObservableList<String>"/>
<variable
name="map"
type="ObservableMap<String,String>"/>
</data>
单向绑定:android:text="@{testInfo.name}"
3. 双向绑定
双向数据绑定的意思即为当数据改变时同时使视图刷新,而试图改变时同时可以改变数据。
android:text="@={testInfo.name}
4. include
当在布局中添加引用布局时
<include layout="" bind:变量名:="@{外层布局中的实例}"/>
不支持include的根布局不是ViewGroup
5.事件绑定
1. 方法引用
在方法引用中,方法的参数与返回值必须与监听器对象的参数相匹配,方法名可以不同。
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onTextChanged="@{mainActivity.onChanged}"/>
public void onChanged(CharSequence s, int start, int before, int count) {
test.setName(s.toString());
}
2. 监听器绑定
而在监听绑定中,只要返回值与监听器对象的预期返回值相匹配即可,可以自己设置参数。
<TextView
android:text="@{testInfo.name}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView"
android:textSize="36sp"
android:textStyle="bold"
android:gravity="center"
android:onClick="@{()->mainActivity.haha(testInfo.name)}"/>
public void haha(String name){
Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
}