Android官方框架DataBinding

前言

DataBinding原來已經出來很久了,居然現在纔開始學習,真是慚愧的很的!首先感謝,Android同行們的無私分享,使得學習資源的取得變得更加容易。
以前我們可以在layout.xml文件中寫佈局(控件),通過DataBinding就可以實現在寫佈局的同時進行賦值了。DataBinding把xml文件分爲了佈局部分和數據部分。

優秀教程

先推薦幾篇優秀的教程
Android官方數據綁定框架DataBinding(一)
這篇文章,我看完了,總的來說,對於入門者是極好的。另外,在文章的下面還有demo供下載,在此向作者的無私,致敬。

Android官方數據綁定框架DataBinding(二)看了第二篇,更感覺DataBinding真是面面俱到,無論是普通的activity佈局還是fragment佈局,再到適配器,DataBinding的數據轉換,倍感很有效率。

Android官方數據綁定框架Data Binding 指南

由於官方對DataBinding的使用是不斷升級的,所以本文還是很有必要的。關於DataBinding的使用,這裏一步步展開

DataBinding的環境配置

由於DataBinding是以支持包的形式對數據綁定進行支持的,因此有很好的兼容性。
The Data Binding Library offers both flexibility and broad compatibility — it’s a support library, so you can use it with all Android platform versions back to Android 2.1 (API level 7+).

To use data binding, Android Plugin for Gradle 1.5.0-alpha1 or higher is required

支持Android2.1(api7)及以上版本,使用data binding要求Android gradle插件的版本是1.5.0以上。
android studio 的最低版本是1.3。
另外更正一點的是,不同於以上推薦的文章一介紹的,此處配置只需:

android {
    ....
    dataBinding {
        enabled = true
    }
}

然後你就可以使用data binding了。
另外還有一點需要說明的是,如果你的moudle引用了使用了data binding的library,此時你的moudle也需要進行以上配置。
用於驗證本文代碼的編譯環境如下:Android studio 2.1.2 classpath 'com.android.tools.build:gradle:1.5.0'

第一個簡單的實例

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

layout標籤下的子標籤<variable>用於定義下方佈局控件綁定的數據。而lastName同user.getLastName()。這有點類似於groovy的語言風格,默認爲變量定義一個get,set方法。另外在引用時需要使用@另附加{}此處的user是一個javabean類。可以以如下之一的形式進行實現:

public class User {
   public final String firstName;
   public final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
}

另一種

public class User {
   private final String firstName;
   private final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
   public String getFirstName() {
       return this.firstName;
   }
   public String getLastName() {
       return this.lastName;
   }
}

數據綁定

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Test", "User");
   binding.setUser(user);
}

此處的類MainActivityBinding是自動生成的,命名規則如:layout佈局文件名稱順序以下劃線分隔出的單詞 首字母大寫+Binding組合而成。
另外一個可選的方案是:

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater(),R.layout.main_activity, ((ViewGroup) getWindow().getDecorView()),true);

事件處理

事件索引

例如有如下方法:

public class MyHandlers {
    public void onClickFriend(View view) { ... }
}

你可以將該方法·onClickFriend()與控件的onClick相關聯。
關聯方式:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.Handlers"/>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
           android:onClick="@{handlers::onClickFriend}"/>
   </LinearLayout>
</layout>

這裏引用方法使用雙冒號::有點類似於c++的味道。

將數據與Listener進行綁定

假如定義瞭如下監聽:

public class Presenter {
    public void onSaveClick(Task task){}
}

佈局中的引用

  <?xml version="1.0" encoding="utf-8"?>
  <layout xmlns:android="http://schemas.android.com/apk/res/android">
      <data>
          <variable name="task" type="com.android.example.Task" />
          <variable name="presenter" type="com.android.example.Presenter" />
      </data>
      <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
          <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
          android:onClick="@{() -> presenter.onSaveClick(task)}" />
      </LinearLayout>
  </layout>

這裏的引用使用lambada表達式。如果onClick(View view)的view對開發者無用,此處可以省略不寫。
以上等同於:

  android:onClick="@{(view) -> presenter.onSaveClick(task)}"

如果你的事件中對view有使用,可以用如下方式:

public class Presenter {
    public void onSaveClick(View view, Task task){}
}
  android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"

爲了避免複合監聽(就是一個控件多個監聽,容易混淆),此時定義了多個屬性:

Class Listener Setter Attribute
SearchView setOnSearchClickListener(View.OnClickListener) android:onSearchClick
ZoomControls setOnZoomInClickListener(View.OnClickListener) android:onZoomIn
ZoomControls setOnZoomOutClickListener(View.OnClickListener) android:onZoomOut

如何訪問控件的問題

首先你需要給控件設定id,然後DataBinding框架將會在生成的binding類中生成一個以id名命名的空間名。不過下劃線省略了。例如:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
   android:id="@+id/firstName"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"
  android:id="@+id/lastName"/>
   </LinearLayout>
</layout>

這是在MainActivityBinding中會生成兩個常量:

public final TextView firstName;
public final TextView lastName;

後記

DataBinding還有例如數據觀察,導包,方法重命名等一些知識,在以上推薦的兩篇文章中都有所涉及。這裏就不在重複了。

另外,不要忘了根本:關於DataBinding的官方文檔
如有新的學習體會,後續補充·····


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章