Android之MVVM架構指南(二):DataBinding
DataBinding 出現的目的旨在取代findViewById()
方法,但是它的功能不僅如此。
配置
-
在
build.gradle
中開啟功能
android { ... dataBinding { enabled = true } }
-
在
gradle.properties
中啟用新的編譯器
android.databinding.enableV2=true
基本操作
實現一個databinding基本上需要完成三個步驟的工作
1. 建立資料來源
即普通的JavaBean物件。
2. 在xml中定義
Databinding支援的佈局檔案跟標籤是固定<layout>
標籤,且需要一個<data>
標籤來宣告資料來源。
<?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 <-- 佈局檔案 !--> </LinearLayout> </layout>
上述xml檔案中,<variable>
標籤就是宣告一個在xml中可用的變數,裡面的兩個屬性分別對應的是變數名和變數型別。
有了資料來源的變數,我們就可以把它繫結給指定的控制元件:
<TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" />
3. 在activity中使用
Android 開發者官方文件上說,當你建立了一個databinding型別的佈局檔案後,gradle 編譯器會自動生成一個與之對應的繫結類。
繫結類的命名規則為:駝峰化xml檔名 + Binding.java
。
在activity中的獲取方式為:
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
有了binding物件後你就可以直接使用佈局檔案中的控制元件了:
// 控制元件的變數名就是佈局檔案中的id名 binding.name.setBackgroundColor(Color.WHITE);
當然我們並不需要手動為每個空間賦值,只需要:
User user = new User("Test", "User"); binding.setUser(user);
點選事件
點選事件的監聽有兩種方法:
-
直接呼叫方法。這種跟之前在activity裡設定onclick有些類似,註冊的方法必須是
onClick(View view)
形式的帶著View引數的,使用方法是:
android:onClick="@{objectName::funName}"
- 繫結監聽器。這種方法對於註冊的方法沒有任何要求,有引數沒有引數的,引數型別是什麼樣的都沒有限制,使用方法是:
android:onClick="@{() -> presenter.onSaveClick(task)}"
這是一個lamda表示式,小括號裡的view引數根據自己需求填不填都可以,就相當於在此處註冊了一個監聽器。
顯然第二種方法要更加的靈活,不僅可以根據需要傳遞任何引數,而且還不會強制要求註冊方法必須傳遞view引數。
RecyclerView中使用
在adapter中實現:
@Override public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) { Test test = data.get(i); viewHolder.itemListBinding.setVariable(BR.test,test); } class ViewHolder extends RecyclerView.ViewHolder { private ItemListBinding itemListBinding; ViewHolder(@NonNull View itemView) { super(itemView); itemListBinding = DataBindingUtil.bind(itemView); } }
BR
是自動生成的類,包含了所有的layout標籤下的variable變數id。
繫結介面卡
在開發過程中除了文字類標準的資料外,還有比較特殊的資料,例如從網路上載入一張圖片我們就不能直接在XML中直接綁定了,這時候就需要繫結介面卡了。自定義一個繫結介面卡很簡單:
public class ImageUtil { @BindingAdapter({"imageUrl"}) public static void showImage(ImageView imageView, String url) { //被註釋的方法必須是靜態的。 Glide.with(imageView.getContext()).load(url).into(imageView); } }
接下來在XML中直接使用即可:
<ImageView app:imageUrl="@{user.imageUrl}" />
實現原理簡述
DataBinding 並是不真的把findViewById()
替換掉了,而是相當於對findViewById()
的封裝,Android外掛會自動把根標籤<layout>
的佈局轉換為對應的繫結類。
下一節
ofollow,noindex">Android之MVVM架構指南(三):Lifecycle