概述
Data Binding,顧名思義,數據綁定,是Google對MVVM在Android上的一種實現,可以直接綁定數據到xml中,并實現自動刷新。現在最新的版本還支持雙向綁定,盡管使用場景不是那么多。
Data Binding可以提升開發效率(節省很多以往需要手寫的java代碼),性能高(甚至超越手寫代碼),功能強(強大的表達式支持)。
1、Data Binding 如何使用 ?
1.1 環境配置
首先,你需要滿足條件:
需要android studio1.3版本及以上
你的Android Plugin for Gradle版本必須等于或高于1.5.0-alpha1版本
接著,你必須告訴編譯器開啟Data Binding , 即在app build.gradle文件中的android 節點添加:
android {
....
dataBinding {
enabled = true
}
}
1.2 基礎知識
布局文件
使用 Data Binding 之后,xml 的布局文件就不再用于單純地展示 UI 元素,還需要定義 UI 元素用到的變量。所以,它的根節點不再是一個 ViewGroup,而是變成了 layout,并且新增了一個節點 data。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 在data內描述了一個名為user的變量屬性,使其可以在這個layout中使用: -->
<data>
<variable
name="user"
type="com.demo.databinding.bean.User"/>
<variable
name="aboutus"
type="String"/>
</data>
<!--原先的根節點(Root Element)-->
<LinearLayout
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/activity_horizontal_margin"
tools:context="com.demo.databinding.MainActivity">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{"" + user.age}'/>
</LinearLayout>
</layout>
定義 Variable
回到布局文件,在 data節點中聲明一個 User類型的變量 user。
<!-- 在data內描述了一個名為user的變量屬性,使其可以在這個layout中使用: -->
<data>
<variable name="user" type="com.demo.databinding.bean.User"/>
</data>
其中 type屬性就是我們在 Java 文件中定義的 User類。
當然,data節點也支持 import,所以上面的代碼可以換一種形式來寫。
<data>
<import type="com.demo.databinding.bean.User" />
<variable name="user" type="User" />
</data>
后我們剛才在 build.gradle 中添加的那個插件 - com.android.databinding會根據 xml 文件的稱 Generate 一個繼承自ViewDataBinding 的類。 當然,IDE 中看不到這個文件,需要手動去 build 目錄下找。
例如,這里 xml 的文件名叫 activity_main.xml,那么生成的類就是 ActivityMainBinding
。
注意
java.lang.*
包中的類會被自動導入,可以直接使用,例如要定義一個 String類型的變量:
<variable name="firstName" type="String" />
綁定 Variable
修改MainActivity的 onCreate方法,用 DatabindingUtil.setContentView() 來替換掉 setContentView(),然后創建一個 user 對象,通過 binding.setUser(user)與 variable進行綁定。
public class MainActivity extends AppCompatActivity {
/**
* ActivityMainBinding 是自動生成的, 命名規則是, 布局文件名稱 + binding ,遵循駝峰命名法
*
*/
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("KAKA",29);
binding.setUser(user);
binding.setAboutus("關于我們");
binding.tvAboutus.setVisibility(View.VISIBLE);
}
}
除了使用框架自動生成的 ActivityBasicBinding,我們也可以通過如下方式自定義類名。
<data class="com.example.CustomBinding"></data>
注意
ActivityBasicBinding類是自動生成的,所有的 set方法也是根據 variable名稱生成的。例如,我們定義了兩個變量。
<data>
<variable name="firstName" type="String" />
<variable name="lastName" type="String" />
</data>
那么就會生成對應的兩個 set 方法。
setFirstName(String firstName);
setLastName(String lastName);
使用 Variable
數據與 Variable 綁定之后,xml 的 UI 元素就可以直接使用了。
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
至此,一個簡單的數據綁定就完成了。
1.3 高級使用
事件綁定
嚴格意義上來說,事件綁定也是一種變量綁定。我們可以在xml中直接綁定
android:onClick
android:onLongClick
android:onTextChanged
方法引用
通常會在java代碼中定義一個名為Handler或者Presenter的類,然后set進來,方法簽名需和對應listener方法一致。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 在data內描述了一個名為user的變量屬性,使其可以在這個layout中使用:-->
<data>
<variable name="user" type="com.demo.databinding.bean.User"/>
<variable name="aboutus" type="String"/>
<variable
name="presenter"
type="com.demo.databinding.MainActivity.Presenter"/>
</data>
<!-- class 自定義 名稱
<data class = "CustomName">
<import type="com.demo.databinding.bean.User" />
<variable name="user" type="User" />
</data>-->
<LinearLayout
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/activity_horizontal_margin"
tools:context="com.demo.databinding.MainActivity">
<TextView
android:id="@+id/tv_aboutus"
android:onClick="@{presenter.onClick}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{aboutus}'/>
</LinearLayout>
</layout>
在Activity 中
public class MainActivity extends AppCompatActivity {
/**
* ActivityMainBinding 是自動生成的, 命名規則是, 布局文件名稱 + binding ,遵循駝峰命名法
*
*/
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("KAKA",29);
// binding.setUser(user);
// 或者直接通過setVariable
binding.setVariable(BR.user,user);
binding.setPresenter(new Presenter());
binding.setAboutus("關于我們");
binding.tvAboutus.setVisibility(View.VISIBLE);
}
public class Presenter{
public void onClick(View view) {
Toast.makeText(MainActivity.this, "點擊事件...", Toast.LENGTH_SHORT).show();
}
}
}
2. 使用Data Binding有什么好處
3. 使用后 有什么弊端
4. 工作流程及原理
4.1 工作流程
4.1.1
Data Binding 做的第一件事就是進入并處理您的布局文件,其中的“進入”指的是,在你的程序代碼正在被編譯的過程中,它會找出布局文件中所有關于它的內容,獲取到它所需要的信息,然后刪掉它們,刪掉它們的原因是如果繼續存著視圖系統并不認得它們。
4.1.2 第二步驟就是通過語法來解析這些表達式,例如:
<TextView android:visibility="@user.isAdmin ? View.VISIBLE : View.GONE}"/>
4.1.3
第三步就是在你代碼編譯過程中解決相關依賴問題。在這一步中,例如,我們看一下 user.isAdmin,想:“這是在運行時獲取到 User 類對象中的一個布爾值?!?/p>
4.1.4
最后一步就是 Data Binding 會自動生成一些你不需要再寫的類文件,總之到這里你只要享受它帶來的好處??就是了。
參考文章
1、Data Binding(數據綁定)用戶指南
2、棉花糖給 Android 帶來的 Data Bindings(數據綁定庫)
3、Android Data Binding從抵觸到愛不釋手
4、Android官方數據綁定框架DataBinding
5、QQ音樂技術團隊分享 — Android DataBinding 數據綁定
6、精通 Android Data Binding
7、從零開始的Android新項目7 - Data Binding入門篇