DataBinding 簡單使用

使用條件限制

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());

然後創建對象並設置數據,效果就出來了。
data1.png

此時如果我想修改用戶的年齡,該怎麼辦呢?
使用 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);
            }
        });

然後運行程序點擊修改按鈕,發現年齡並沒有發生變化。
updateage.gif

這個時候就需要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文件的使用  

然後重新運行程序,發現數據修改了之後界面也刷新了數據。雙向綁定成功。

updateage2.gif

是不是有種很麻煩的感覺。當然,下面我們就使用更簡便的方法來實現數據雙向綁定。

修改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);
            }
        });

運行程序,發現數據雙向綁定成功實現。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章