早在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類。
運行結果
看到這里,估計也應該有人被他的簡潔吸引了吧。下面對可能產生的疑惑進行解釋
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
歡迎學習交流這個系列的文章
DataBinding系列(二):DataBinding的基本用法
DataBinding系列(三):RecyclerView中使用DataBinding
DataBinding系列(四):DataBinding進階之路