Android官方的數據綁定框架 — Data Binding Library學習筆記

概述

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入門篇

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

推薦閱讀更多精彩內容