DataBinding系列(一):DataBinding初認識

早在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之后,這些冗余的代碼統統都可以得到簡化,從而真正的只需要專注于你的業務邏輯的處理即可。

今天只是初識DataBinding,接下來會出一個系列來講解它的真正運用,希望大家持續關注。

感謝
aspect-oriented-programming-in-android
翻譯 Android中的AOP編程 Android 開發中使用 AOP
深入理解Android之AOP Android基于AOP的非侵入式監控之——AspectJ實戰
精通 Android Data Binding

github源碼下載

歡迎學習交流這個系列的文章
DataBinding系列(二):DataBinding的基本用法
DataBinding系列(三):RecyclerView中使用DataBinding
DataBinding系列(四):DataBinding進階之路

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容