Databinding 是一個用于將布局中的控件與數(shù)據(jù)源直接關(guān)聯(lián)綁定的支持庫,它替代了傳統(tǒng)的 findViewById 以及代碼設(shè)置控件的內(nèi)容值的方式。這樣做的好處顯而易見,Activity/Fragment 上就沒有了一堆控件代碼,官方還說提高了性能,避免了內(nèi)存泄漏和空指針,總之是值得推薦的。
怎么上手
最近項目里也是用上了 Databinding,不過其實也只用了布局那部分,并沒有用到數(shù)據(jù)映射(這部分還要再了解了解)。
不像其他依賴庫,它集成在 Android Gradle plugin 里,所以只要插件版本高于 1.5.0(包含 1.5.0)即可使用,可運行的系統(tǒng)版本為 Android 4.0 及以上。
android {
//官方文檔讓這么配置,但是前提是項目根目錄下的 build.gradle 中的 gradle 插件版本夠新
//新到什么程度呢?最好是最新版,要不然也得 4.0.0 以上,我沒有測試成功,因為項目中版本是3.6.3
//然后我這么用就報錯了,參考了這個https://github.com/stripe/stripe-terminal-android/issues/90 發(fā)現(xiàn)可能是 gradle 插件版本問題
buildFeatures {
dataBinding true
}
//如果上面方式報錯,就用下面這種方式,二選一
dataBinding {
enabled = true
}
}
配置編譯完就可以在 xml 布局中使用了,需要注意的一點是xml文件的根節(jié)點需要以 layout 標簽開頭,這和原來的布局文件有區(qū)別,以前是直接具體某個布局控件,現(xiàn)在相當(dāng)于又多了一層,在新建布局文件時,是可以指定根布局為 layout 標簽的,這樣用起來和以前就沒差別了。
//在 layout 為根節(jié)點的基礎(chǔ)上,首先需要用 data 標簽定義數(shù)據(jù)
<data>
<variable
name="隨便定義"
type="指具體路徑的 model 類"/>
//如果配置正確,上面的 type 賦值可以根據(jù)引導(dǎo)一步步點出來,不用自己手打
</data>
//定義好數(shù)據(jù)變量之后,就可以像下面這樣使用,具體表達格式為 @{},
//還有很多具體的語法可以參考官方文檔 https://developer.android.com/topic/libraries/data-binding/expressions
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName, default=my_default}"/>
現(xiàn)在布局差不多設(shè)置好了,接下去就是要讓實際數(shù)據(jù)源更新到布局控件上展示出來。這里有個概念就是 Binding 類,在代碼中要想使用 Databinding,就要通過 Binding 類,而 Binding 類是根據(jù)相對應(yīng)的布局文件自動生成的,例如布局文件叫 activity_main.xml 那么這個 Binding 類就叫 ActivityMainBinding。那要怎么獲取到相應(yīng)對象呢?
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//像這樣等價代換 Activity 的 onCreate 方法里的 setContentView(R.layout.activity_main);
//也就是說用來 DataBinding 就不像原來那樣設(shè)置布局頁面了。
有了 Binding 類對象后就可以給布局文件里定義的數(shù)據(jù)變量賦值了,賦值之后自然相關(guān)控件的內(nèi)容也就跟著改變了。
在項目的實際使用上,我們常見的 Activity, Fragment, RecyelerView 的適配器上,Dialog, PopupWindow 都能用,在 ButterKnife 不再推薦使用的當(dāng)下,可謂是非常方便。
另外和 Databinding 相關(guān)的一個概念叫 View Binding,區(qū)別在于如果僅是用于替代 findViewById 的工作,就可以用 View Binding,而不必要用 Databinding。同時 View Binding 也是 ButterKnife 的替代方案,在 ButterKnife 的官網(wǎng)上也注明,不再維護,而是推薦 View Binding。那么問題來了,怎么看 View Binding 都會被 Databinding 給取代的感覺,為什么還要留著它呢?