Data binding 在2015年7月發(fā)布的Android Studio v1.3.0 版本上引入喳挑,在2016年4月Android Studio v2.0.0 上正式支持。目前為止赂弓,Data Binding 已經(jīng)支持雙向綁定了透绩。
Databinding 是一個實現(xiàn)數(shù)據(jù)和UI綁定的框架推姻,是Google對MVVM在Android上的一種實現(xiàn)再膳,可以直接綁定數(shù)據(jù)到xml中醉旦,并實現(xiàn)自動刷新忘巧。
從開發(fā)角度看恒界,DataBinding主要解決了兩個問題:
1、需要多次使用findViewById砚嘴,損害了應(yīng)用性能且令人厭煩
2十酣、更新UI數(shù)據(jù)需切換至UI線程,將數(shù)據(jù)分解映射到各個view比較麻煩
使用DataBinding 的條件很簡單:
1际长、保證AndroidStudio的版本 >2.0
2耸采、在對應(yīng)Module的build.gradle文件
android {dataBinding {enabled = true}}
簡單入門:
1、定義一個JavaBean (實體類)
2工育、Layout件 首先虾宇,在布局的最外層再套一層 標簽然后,在 layout 標簽下面定義 標簽如绸。 data 標簽下面的 variable 定義數(shù)據(jù)綁定用的實體類嘱朽。 name 是自定義的名字,可以在綁定數(shù)據(jù)的時候使用 type里面是完整的帶包名的類
3怔接、通過@{} 將數(shù)據(jù)綁定到UI上
4燥翅、數(shù)據(jù)綁定 之前的 Layout 文件的定義會默認生成一個數(shù)據(jù)綁定類,這個數(shù)據(jù)綁定類的名稱默認和 Layout 文件的類名有關(guān)蜕提。比如 activity_main.xml 會生成 ActivityMainBinding.java 文件森书。在onCreate中用 DatabindingUtil.setContentView() 替換之前的 setContentView(),返回值是自動生成的 ActivityMainBinding,然后調(diào)用 set 方法把 實例綁定到 XML 文件中去凛膏。
原理分析:
1杨名、對布局的預(yù)處理data-binding-layout-out 下的activity_main 文件data-binding-info 下的 activity_main-layout 文件在activity_main文件中會發(fā)現(xiàn) 根元素LinearLayout和那些在屬性中使用了binding表達式的view都被設(shè)置了Tag,而原有的標簽猖毫、data標簽以及里面的variable標簽台谍,還有各個view中的binding表達式都不見了。DataBinding把最初布局文件中的以及各個view中的binding表達式內(nèi)容抽取出來吁断,生成了一個名為activtiy_main-layout.xml文件趁蕊,通過給原有布局文件中的view設(shè)置Tag和在生成的文件中(activtiy_main-layout.xml)使用Tag,使得抽取出來的內(nèi)容能夠與其原先所在的位置對應(yīng)起來仔役。
2掷伙、生成ActivityMainBinding與BR類
DataBinding將會依據(jù)上面兩個xml文件(即activtiy_main.xml和activtiy_main-layout.xml)生成兩個類,一個類是ActivityMainBinding又兵,它繼承自ViewDataBinding任柜;一個是BR類。
在ViewDataBinding中
對應(yīng)每個variable標簽沛厨,ActivityMainBinding都有一個相應(yīng)的變量宙地。
對應(yīng)每一個有id的View,都會有一個以其id為名的public final變量逆皮,其類型正是該View的類型宅粥。
對應(yīng)每一個沒有id但是處理中添加了Tag 的View,都會有一個private final的變量與其對應(yīng)电谣,名字沒有什么特殊的含義(如mboundView0,mboundView3)秽梅。
3、生成ActivityMainBinding實例并綁定
第一步就是Inflate 處理后的布局文件辰企,activity_main.xml文件與普通的layout文件一樣》缇溃現(xiàn)在DataBindingUtil將會Inflate activity_main.xml文件况鸣,得到一個ViewGroup變量root牢贸。
第二步就是生成ActivityMainBinding實例對象,DataBindingUtil會將這個變量root傳遞給ActivityMainBinding的構(gòu)造方法镐捧,生成一個ActivityMainBinding的實例潜索,就是我們在onCreate方法中獲取的binding對象。
在ActivityMainBinding的構(gòu)造方法中懂酱,會首先遍歷root竹习,根據(jù)各個View的Tag或者id,初始化自己列牺,然后ActivityMainBinding將會把之前加到各個View上的Tags清空整陌。
最后,構(gòu)造方法調(diào)用invalidateAll引發(fā)數(shù)據(jù)綁定?invalidateAll函數(shù) 最終會執(zhí)行到executeBindings函數(shù) 進行數(shù)據(jù)綁定 ,在executeBindings函數(shù)中泌辫,ActivityMainBinding將會計算各個view上的binding表達式随夸,然后賦值給view相應(yīng)的屬性。
參考博客:
developer.android.google.cn/topic/libraries/data-binding/index.html