Android DataBinding介紹(一)——簡介、數據及方法事件綁定

簡介

Data binding 是Google在2015年7月發佈的Android Studio v1.3.0 版本上引入的,在2016年4月Android Studio v2.0.0 上正式支持。引入之初,不支持雙向綁定,目前已經支持了。
DataBinding 是基於MVVM思想實現數據和UI綁定的的框架,有了 Data Binding,在Android中也可以很方便的實現MVVM。
在引入DataBinding之前,我們需要敲很多很雞肋的代碼,如 findViewById()、setText(),setVisibility(),setEnabled() 或 setOnClickListener() 等,通過 Data Binding , 我們可以通過聲明式佈局以精簡的代碼來綁定應用程序邏輯和佈局,這樣就不用編寫大量的毫無營養的代碼了。
DataBinding 是一個support庫,最低支持到Android 2.1(API Level 7+)

環境構建

1、先下載最新的 Support repository和Google Repository,如果在引入過程中報如下錯誤,一把就是由於沒有升級前兩個庫造成的

2、在Module的build.gradle文件中的android節點下做如下配置:


3、要求
Android Plugin for Gradle: 1.5.0-alpha1及以上
Android Studio 1.3
及以上

具體使用方式

簡單數據綁定

1、佈局文件將更節點變爲layout節點並引入data節點,同時創建好需要用到的Model
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="user"
            type="com.victor.databinding.User"/>
    </data>
public class User {

    public String firstName;
    public String lastName;
    public String phone; // 電話
    public boolean isShowPhone;

    /**
     * 獲取全名
     * @param firstName
     * @param lastName
     * @return
     */
    public String getFullName(String firstName, String lastName) {
        StringBuilder sb = new StringBuilder();
        sb.append("全名:");
        if (!TextUtils.isEmpty(firstName)) {
            sb.append(firstName);
        }
        if (!TextUtils.isEmpty(lastName)) {
            sb.append("." + lastName);
        }
        return sb.toString();
    }
}

其中data節點下一個variable節點代表一個變量,name屬性根據需要自己取名,type爲需要用到的Model的全路徑,功能相當於寫代碼的時候引入一個類的功能

2、在Activity中,用 DataBindingUtil.setContentView(Activity activity, int layoutId)代替setContentView(int layoutId),同時初始化數據,並進行綁定
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 要用setContentView(Activity activity, int layoutId)代替該方法
        //setContentView(R.layout.activity_main);

        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        // 初始化數據
        User user = new User();
        user.firstName = "Victor";
        user.lastName = "Fang";
        user.phone = "13333333333";
        user.isShowPhone = false;
        // 綁定數據
        binding.setUser(user);
}
其中ActivityMainBinding是根據你綁定的佈局文件的名稱去掉下劃線後加上Binding,由系統自動生成。

3、在佈局文件中使用數據綁定
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content
    android:text="@{user.firstName}"/>
其中user就是你第一步定義data節點下的變量(variable)中name屬性值。firstName是Model中的變量名
將app跑起來就能看到TextView已經能展示數據了


三元表達式

DataBinding還支持三元表達式功能,如在佈局文件中添加如下節點
但是需要注意的是:引用了API原有的類,如View,是需要通過import節點導入的,不然會報錯
<data>
        <!--<import type="com.victor.databinding.User"/>-->
        <import type="android.view.View"/>


<!-- 三元表達式 -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.phone}"
            android:visibility="@{user.isShowPhone ? View.VISIBLE : View.GONE}"/>
一開始我們初始user的時候,isShowPhone = false,所以不會看到有電話號碼顯示(下左圖),如果我們將isShowPhone改爲true,顯示如下右圖


方法事件綁定

DataBinding除了支持數據綁定外,還可以綁定方法和監聽事件

普通方法的綁定,直接在佈局文件中,通過變量名調用方法即可,和java代碼裏面使用相似
<!--類方法的綁定-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.getFullName(user.firstName, user.lastName)}"/> <!--調用User類裏面的獲取全名的方法-->
顯示效果:


事件綁定
類似於 android:onClick 可以指定 Activity 中的函數,Data Binding 也允許處理從視圖中發送的事件。兩種實現方式:
方法調用監聽綁定
二者主要區別在於方法調用在編譯時處理,而監聽綁定於事件發生時處理。
方法調用
<!--事件綁定-->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ShowToast"
            android:onClick="@{handler::showTost}"/>
其中用的handler類創建後也許通過data節點下引入
public class MyHandler {

    public void showTost(View view) {
        Toast.makeText(view.getContext(), "展示吐司", Toast.LENGTH_SHORT).show();
    }

    public void onEventListenerExecute(MyTask task) {
        task.run();
    }

}


 <variable
            name="handler"
            type="com.victor.databinding.MyHandler"/>
這樣不用再代碼裏面寫任何事件監聽的代碼,就能夠相應按鈕的點擊事件
監聽綁定
需要注意的是:此功能在 Android Gradle Plugin version 2.0 或更新版本上可用,支持lambda表達式
在方法引用中,方法的參數必須與監聽器對象的參數相匹配。
在監聽綁定中,只要返回值與監聽器對象的預期返回值相匹配即可
佈局文件
<!-- 監聽綁定 使用lambda表達式 -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="runTask"
            android:onClick="@{() -> handler.onEventListenerExecute(task)}"/>
Task類如下
public class MyTask implements Runnable {

    private Context mContext;

    public MyTask(Context context) {
        mContext = context;
    }

    @Override
    public void run() {
        Toast.makeText(mContext, "執行任務", Toast.LENGTH_SHORT).show();
    }
}
展示效果:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章