DataBinding 是谷歌官方发布的一个框架,DataBinding 能够省去我们一直以来的 findViewById() 步骤,大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常。
要将应用配置为使用数据绑定,请在应用模块的 build.gradle 文件中添加 dataBinding 元素,如以下示例所示:
android {
...
dataBinding {
enabled = true
}
}
1、基本使用
1.1 布局中的用法
选中根布局option+回车,点击 “Convert to data binding layout”自动生成如下格式,或者手动写成下面的格式:layout包裹 data 和实际的布局,data 标签的作用就像一个桥梁搭建了 View 和 Model 之间的通道
<?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>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
在 variable 标签里声明要使用到的变量名、类的全路径
<data>
<variable
name="user"
type="com.example.myapplication.model.User" />
</data>
也可以通过import来引入包名
<data>
<import
type="com.example.myapplication.model.User"/>
<variable
name="user"
type="User" />
</data>
还可以通过alias给类设置别名
<data>
<import
alias="LoginBean"
type="com.example.myapplication.model.User"/>
<variable
name="user"
type="LoginBean" />
</data>
其他类型的数据
<data>
<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>
通过@{}的方式来给控件赋值
<EditText
android:id="@+id/et_user_name"
android:text="@{userBean.name}"
...
/>
<EditText
android:id="@+id/et_user_psw"
android:text="@{userBean.password}"
...
/>
@{}中使用表达式
android:text="@{String.valueOf(age)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:text='@{"iname:" +user.name}'
@{}点击事件
<variable
name="listener"
type="com.example.myapplication.TestDataBinding.Listenter" />
android:onClick="@{()->listener.clickListner()}
<variable
name="clickListener"
type="android.view.View.OnClickListener" />
android:onClick="@{clickListener}"
1.2 代码中的用法
通过DataBindingUtil获取到Binding对象,创建数据并设置给Binding对象
public class TestDataBinding extends Activity {
private User user;
private ActivityDatabindingBinding activityDatabindingBinding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityDatabindingBinding = DataBindingUtil.setContentView(
this,R.layout.activity_databinding);
user = new User();
user.setName("databing");
user.setPassword("test123456");
activityDatabindingBinding.setUserBean(user);
}
}
Binding对象的名字是根据布局文件名字+Binding生成的,你还可以在xml中制定Binding对象的名字 1、设置自定义的名称
<data class="CustomBinding">
<variable
name="userBean"
type="com.example.myapplication.model.User" />
</data>
2、创建相应的实现ViewBingdingj接口的类’
public class CustomBinding implements ViewBinding {
@NonNull
@Override
public View getRoot() {
return null;
}
}
3、得到Binddings对象
public class TestDataBinding extends Activity {
private User user;
private CustomBinding customBinding;
public static void intentTo(Context context) {
Intent intent = new Intent(context, TestDataBinding.class);
context.startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
customBinding = DataBindingUtil.setContentView(this,R.layout.activity_databinding);
user = new User();
user.setName("databing");
user.setPassword("test123456");
customBinding.setUserBean(user);
}
}
2 单向数据绑定
单向数据绑定的方式有三种:BaseObservable、ObservableField、ObservableCollection,都能实现数据变化自动驱动 UI 刷新。
2.1 BaseObservable
|