前言
DataBinding是谷歌开发的一个框架,主要做的就是让界面和数据绑定,数据变动的时候界面也随之变动。如果学过vue.js应该就知道这两者是类似的。DataBinding 能够省去我们一直以来的 findViewById() 步骤,大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常
配置
我们需要在Model 的 build.gradle加入DataBinding 的支持,可以看到这和添加其他第三方类库不太一样,有一种亲儿子的感觉
android {
dataBinding {
enabled = true
}
}
简单使用
打开布局文件,选中根布局的 ViewGroup,按住 Alt + 回车键,点击 “Convert to data binding layout”,就可以生成 DataBinding 需要的布局规则
image.png
点击后原文件会变成下面
<?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>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
</layout>
其实就是使用layout标签将原来的布局包住,再在里面添加了data标签,data标签就是来声明Model类的,所以接下来我们定义一个模型吧
package com.shart.model;
public class User {
private String name;
private String age;
public User(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
接下来就可以在布局文件中关联model和视图的关系了
<data>
<import type="com.shart.model.User" />
<variable
name="userInfo"
type="User" />
</data>
import为引入这个类型,也可以在variable的type属性中使用全类名。还可以在improt的属性中使用alias别名
在data中定义完类型后就可以在视图中使用了
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{userInfo.name,default=zhoufan}" />
<TextView
android:id="@+id/tv_password"
android:layout_marginTop="50dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{userInfo.age}" />
</LinearLayout>
通过 @{userInfo.name} 使 TextView 引用到相关的变量,DataBinding 会将之映射到相应的getter方法
最后我们在Activity中去使用它
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
ActivityMainBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("fujie", "23");
viewDataBinding.setUserInfo(user);
}
原本的setContentView被 DataBindingUtil.setContentView代替,其返回的是自动生成的布局文件对象
每个数据绑定布局文件都会生成一个绑定类,ViewDataBinding 的实例名是根据布局文件名来生成,将之改为首字母大写的驼峰命名法来命名,并省略布局文件名包含的下划线。控件的获取方式类似,但首字母小写
运行
注意
这里如果你的类路径写错,DataBinding很可能不会报出明显的错误。而是报它自动生成的类找不到。这是很恶心人的地方,所以你要去检测你的布局文件的类名是否写错。
网友评论