由於它是一個 support library
所以最低可以支援到 Android 2.1 (API level 7)
要使用 Data Binding 的話需要一些條件:
1. Android Studio 1.3 以上
2. Android Plugin for Gradle 1.5.0-alpha1 以上
3. 在 app 的 build.gradle 加入 dataBinding 設定
android {
....
dataBinding {
enabled true
}
}
Data Binding 的 layout xml 檔範例如下:
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.fuhu.testdatabinding.MainActivity"
>
<data>
<variable
name="dataObj"
type="com.fuhu.testdatabinding.MyDataObj"
/>
<variable
name="handlers"
type="com.fuhu.testdatabinding.MyHandlers"
/>
</data>
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main"
app:customData="@{dataObj}"
app:handlers="@{handlers}"
/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email"/>
</android.support.design.widget.CoordinatorLayout>
</layout>首先,root element 是 layout tag
binding 的 data object 則是在 data tag 中的 variable
而使用物件的值則是用 @{varname.attribute} 的寫法
另外由於我們使用了 include 的方式
所以用 app 自訂屬性把 dataObj 變數以 customData 的自訂屬性名稱傳進去
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.fuhu.testdatabinding.MainActivity"
tools:showIn="@layout/activity_main"
>
<data>
<variable
name="customData"
type="com.fuhu.testdatabinding.MyDataObj"
/>
<variable
name="handlers"
type="com.fuhu.testdatabinding.MyHandlers"
/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{customData.alias}"
android:onClick="@{customData.isMember ? handlers.onClickMemberData : handlers.onClickLogin}"
/>
</RelativeLayout>
</layout>而被 include 的 xml 檔案也要使用 layout tag 作為 root element
並定義 customData 變數與型別
就可以在檔案內使用該變數實體的屬性
Data Object 可以用 plain-old Java object (POJO) 或是 JavaBeans object
JavaBeans object 範例如下:
public class MyDataObj {
public boolean isMember = false;
private String alias;
public String getAlias() { return alias; }
public void setAlias(String alias) {
this.alias = alias;
}
private String imageUrl;
public String getImageUrl() { return imageUrl; }
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
}
而 data 的 Binding 則是透過以下的寫法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
ActivityMainBinding testbinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
MyDataObj dataObj = new MyDataObj();
dataObj.setAlias("Oh yeah !! It works.");
testbinding.setDataObj(dataObj);
MyHandlers handlers = new MyHandlers();
testbinding.setHandlers(handlers);
...(省略)
}
可以看到我們把原本的 setContentView 改成了 DataBindingUtil.setContentView(this, R.layout.activity_main)
並把 MyDataObj 實體利用 setXXXXX 方法設定給 view
ActivityMainBinding 是自動生成的
layout 名稱為 activity_main 所以自動生成的 Binding 類別就叫做 ActivityMainBinding
相對的如果 layout 是 item_check_list 那 Binding 類別就叫做 ItemCheckListBinding
而除了 DataBindingUtil.setContentView 外
也可以使用
MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());
如果是使用 ListView 或 RecyclerView adapter 可以用:
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);或
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
再來討論一下 event 的 binding
我們需要用原本的事件屬性將事件指到我們自己的 handler
如上面的 android:onClick="@{dataObj.isMember ? handlers.onClickMemberData : handlers.onClickLogin}"
public class MyHandlers {
public void onClickMemberData(View view) {
...(省略)
}
public void onClickLogin(View view) {
...(省略)
}
}相關資料:
YouTube - Android Marshmallow 6.0: Data Binding Library
Data Binding Guide
沒有留言:
張貼留言