1. 程式人生 > >DataBinding系列:DataBinding初認識

DataBinding系列:DataBinding初認識

轉載自:https://www.jianshu.com/p/53925ccb900e

 

早在2015谷歌 I/O大會上,就介紹了一個新的框架DataBinding,從名字就可以看出來,這是一個數據繫結框架。我們為什麼要使用DataBinding?1.再也不需要編寫findViewById了,有人會說,已經有butterknife了,很好用。2.更新UI資料需切換至UI執行緒,也有人說,有rxjava了。但是DataBinding,不僅僅能解決這2個問題,它的核心優勢在於,它解決了將資料分解對映到各個view的問題。什麼個意思?具體來說,就是針對每個Activity或者Fragment的佈局,在編譯階段,會生成一個ViewDataBinding類的物件,該物件持有Activity要展示的資料和佈局中的各個view的引用。同時還有如下優勢:將資料分解到各個view、在UI執行緒上更新資料、監控資料的變化,實時更新,這樣一來,你要展示的資料已經和展示它的佈局緊緊繫結在了一起。我認為這才是DataBinding真正的魅力所在

下面通過一個小例子來讓大家感受一下DataBinding

1、在在Module的build.gradle android模組中新增如下配置

android {
 dataBinding {
    enabled = true
 }
}

2、建立一個簡單的JavaBean物件,姑且就叫UserBean吧

public class UserBean {
    private String name; //姓名
    private int age; //年齡

    public UserBean(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

3、使用了DataBinding之後的Activity的佈局檔案activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="user"
            type="com.zx.databindingdemo.bean.UserBean" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />

        <!--注意:這裡age是int型別,必須轉化為String,否則會執行時異常-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.age)}" />
    </LinearLayout>
</layout>

這裡和以前使用的xml不同,根節點變成了layout,裡面包括了data節點和傳統的佈局。這裡的data節點作用是連線 View 和 Modle 的橋樑。在這個data節點中宣告一個variable變數,那值就可以輕鬆傳到佈局檔案中來了。而且TextView中沒有給控制元件定義id,而是在text的時候用了@{ }的方法,在括號裡面直接引用UserBean物件的屬性即可完成賦值。

4、MainActivity

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        UserBean userBean = new UserBean ("張三", "25");
        binding.setUser(userBean );
    }
}

這個activity很簡潔,沒有了沒有了控制元件的初始化的findViewById或者butterknife的那一堆註解,也沒有了TextView的setText(),也就2行程式碼而已。大家應該已經看見了,這裡用DataBindingUtil.setContentView代替了setContentView,然後建立一個 UserBean 物件,通過 binding.setUser(userBean) 與 variable 進行繫結。注意:這個ActivityMainBinding 是如何生成的呢?他是繼承ViewDataBinding,這個類的生成是有規則的,它是根據對應的佈局檔案的名字生成的,比如:activity_main-->ActivityMainBinding 、fragment-->FragmentBinding即:第一個單詞首字母大寫,第二個單詞首字母大寫,最後都會拼上Binding就是生成的Binding類。

執行結果

執行結果.png

 

看到這裡,估計也應該有人被他的簡潔吸引了吧。下面對可能產生的疑惑進行解釋

1. 為什麼配置了 dataBinding{enabled = true}之後就可以使用dataBinding方式進行開發了?

Android Studio中是依靠gradle來管理專案的,在建立一個專案時,從開始建立一直到建立完畢,整個過程是需要執行很多個gradle task的,這些task有很多是系統預先幫我們定義好的,比如build task,clean task等,DataBinding相關的task也是系統預先幫我們定義好的,但是預設情況下,DataBinding相關的task在task列表中是沒有的,因為我們沒有開啟dataBinding,但是一旦我們通過 dataBinding{enabled = true}的方式開啟DataBinding之後,DataBinding相關的task就會出現在task列表中,每當我們執行編譯之類的操作時,就會執行這些dataBinding Task, 這些task的作用就是檢查並生成相關dataBinding程式碼,比如dataBindingExportBuildInfoDebug這個task就是用來匯出debug模式下的build資訊的。

2. ActivityMainBinding這個類從哪來的?

通過第一個問題的解釋,我們也就知道了ActivityMainBinding這個類其實是系統幫我們自動生成的。
但是如果你在實際編寫程式碼的過程中,你會發現並沒有執行編譯、執行之類等操作,ActivityMainBinding這個類就直接能用了,竟然還有這種操作?其實是Android Studio 這個IDE自動幫我們做了這一步,在預設情況下,系統會使用Android Studio為我們自動生成databinding相關的程式碼,但是這種方式生成的程式碼不能除錯,如果你想通過點選ActivityMainBinding跳轉到它的原始碼中,你會發現並不能如你所願,而是會跳轉到對應的佈局檔案中。那麼如果我們確實要檢視ActivityMainBinding的原始碼並且還想除錯,我們就需要通過另外一種方式:手動編譯程式碼。這兩種方式可以通過Android Studio的設定面板修改。

3.DataBinding與ButterKnife的區別

ButterKnife很多人都用過,在以前的findViewById的時代,我們厭煩了寫這些重複的程式碼,當有了ButterKnife之後,我們採用註解的方式來查詢控制元件和註冊監聽,配合ButterKnife的外掛,大大提升了我們的開發效率,一度成為開發神器,但是有了DataBinding之後,你會發現使用ButterKnife開發還是不夠簡潔:比如你需要給很多TextView setText()要獲取editText的內容前必須要獲取editText物件,給view設定監聽前也必須要獲取這個view物件等等。但是使用了DataBinding之後,這些冗餘的程式碼統統都可以得到簡化,從而真正的只需要專注於你的業務邏輯的處理即可。