使用條件限制
Gradle 版本最低爲1.5.0-alpha1
Android Studio 版本最低爲1.3
使用步驟
模塊下build.gradle
android {
....
dataBinding {
enabled = true
}
}
創建User對象
public class User {
private String firstName;
private String lastName;
private int age;
private String gender;
private String address;
private User(String firstName, String lastName ,int age, String gender ,String address) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age ;
this.gender = gender ;
this.address = address ;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
佈局中寫法
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.databinding.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{"" +user.age}'/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.gender}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.address}"/>
</LinearLayout>
</layout>
綁定數據
需要使用DataBindingUtil來綁定佈局
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
User user = new User("小", "老虎",18,"男","陝西省西安市");
activityMainBinding.setUser(user);
ActivityMainBinding的由來
將佈局 activity_main.xml 轉換爲Pascal格式並將“Binding”後綴添加到該文件中。所以 activity_main.xml 就生成了ActivityMainBinding 類 。
綁定佈局也可以使用下面的方法。
ActivityMainBinding activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
然後創建對象並設置數據,效果就出來了。
此時如果我想修改用戶的年齡,該怎麼辦呢?
使用 user.setAge(100) 嗎,我們可以試一下
添加一個按鈕
<Button
android:id="@+id/btn_update_age"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="修改年齡屬性"
/>
findViewById(R.id.btn_update_age).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUser.setAge(100);
}
});
然後運行程序點擊修改按鈕,發現年齡並沒有發生變化。
這個時候就需要BaseObservable出場了。
public class User extends BaseObservable{
private String firstName;
private String lastName;
private int age;
private String gender;
private String address;
public User(String firstName, String lastName ,int age, String gender ,String address) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age ;
this.gender = gender ;
this.address = address ;
}
@Bindable
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
}
@Bindable
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
@Bindable
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
notifyPropertyChanged(BR.age);
}
@Bindable
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
notifyPropertyChanged(BR.gender);
}
@Bindable
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
notifyPropertyChanged(BR.address);
}
}
第一步 繼承BaseObservable
第二步 get方法使用註解 @Bindable
第三部 set方法中調用notifyPropertyChanged() 方法中還需要填入一個參數,類似於R文件的使用
然後重新運行程序,發現數據修改了之後界面也刷新了數據。雙向綁定成功。
是不是有種很麻煩的感覺。當然,下面我們就使用更簡便的方法來實現數據雙向綁定。
修改User類如下
public class User {
public ObservableField<String> firstName = new ObservableField<>();
public ObservableField<String> lastName = new ObservableField<>();
public ObservableInt age = new ObservableInt();
public ObservableField<String> gender = new ObservableField<>();
public ObservableField<String> address = new ObservableField<>();
public User(String firstName, String lastName ,int age, String gender ,String address) {
this.firstName.set(firstName);
this.lastName.set(lastName);
this.age.set(age);
this.gender.set(gender);
this.address.set(address);
}
}
也不需要繼承BaseObservable,使用ObservableField<>
String --> ObservableField<String>
int --> ObservableInt
boolean --> ObservableBoolean
map --> ObservableArrayMap<String, String>
list --> ObservableArrayList<String>
不一樣的地方是賦值操作。調用.set(value)方法即可。
然後界面不變,修改年齡的方法改一下
findViewById(R.id.btn_update_age).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUser.age.set(100);
}
});
運行程序,發現數據雙向綁定成功實現。