Android dataBinding
一、
使用DataBinding需要Android Gradle插件的支持,版本至少在1.5以上,需要的Android studio的版本在1.3以上。
在Android Studio中使用需要在Module下的build.gradle中添加
android {
...
dataBinding {
enabled = true
}
}
二、
创建一个User类用来测试
public class User {
private int id;
private String username;
...get/set方法
}
将activity_main.xml修改一下
<?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"
tools:context=".MainActivity"
>
<data>
<variable
name="user"
type="com.du.databinding4.bean.User"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</RelativeLayout>
</layout>
添加两个TextView来显示信息,注意android:text属性,可以理解为tvId显示user.id属性,tvUsername显示user.username属性。第一次我在tvId的text属性中直接写的user.id,结果报错了,因为user.id为int类型,在系统调用TextView.setText方法时,调用成TextView.setText(int id)这个方法,我当时设置user.id=1,找不到id=1的String资源,所以报错了,这里直接调用了Stirng.valueof()方法即可。
<TextView
android:id="@+id/tvId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@{String.valueOf(user.id)}" />
<TextView
android:id="@+id/tvUsername"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="187dp"
android:text="@{user.username}" />
到这里需要rebuild一下,这样才能生成相应的类。
我们的布局文件是activity_main.xml,框架就会帮我们生成的类名为ActivityMainBinding。
在MainActivity.java中修改原来的setContentView为DataBindingUtil.setContentView(this , R.layout.activity_main);
public class MainActivity extends Activity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this , R.layout.activity_main);
binding.setUser(user);
user.setId(1);
user.setUsername("jack");
}
}
三、
此时在界面中加上一个Button,我们的预想效果是:当点击按钮时,将user.id=2;user.username=rose显示出来
/**
* 按钮点击事件
* @param view
*/
public void setUser(View view){
user.setId(2);
user.setUsername("rose");
}
运行项目,点击按钮后并没有达到预想的显示2,rose
想有这种效果需要修改一下User类
继承了BaseObservable类,并且在get方法上添加@Bindable,添加后建议rebuild下,notifyPropertyChanged()方法,从字面上来看就是提醒属性改变,BR类似于我们项目中的R文件。之前rebuild,就是为了在BR文件中生成 添加@Bindable标签的属性。
package com.du.databinding4.bean;
import android.databinding.BaseObservable;
import android.databinding.Bindable;
import com.du.databinding4.BR;
public class User extends BaseObservable {
private int id;
private String username;
@Bindable
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
notifyPropertyChanged(BR.id);
}
@Bindable
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
notifyPropertyChanged(BR.username);
}
}
此时在运行项目,点击了按钮后达到了我们预期的效果。
三、
添加一个EditView,我们预想的效果是,将这个EditText与User.username绑定,只要在editText中输入内容,就会赋值给user对象的username
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/button"
android:ems="10"
android:inputType="textPersonName"
android:text="@={user.username}"
android:hint="username" />
注意,android:text="@={user.username}",这里多了一个=
运行项目发现user.username已经与editText绑定了