Android之MVVM架構指南(二):DataBinding

DataBinding 出現的目的旨在取代findViewById()方法,可是它的功能不只如此。java

配置

  1. build.gradle中開啓功能
android {
    ...
    dataBinding {
        enabled = true
    }
}
複製代碼
  1. gradle.properties中啓用新的編譯器
android.databinding.enableV2=true
複製代碼

基本操做

實現一個databinding基本上須要完成三個步驟的工做android

1. 建立數據源

即普通的JavaBean對象。bash

2. 在xml中定義

Databinding支持的佈局文件跟標籤是固定<layout>標籤,且須要一個<data>標籤來聲明數據源。markdown

<?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中可用的變量,裏面的兩個屬性分別對應的是變量名和變量類型。網絡

有了數據源的變量,咱們就能夠把它綁定給指定的控件:app

<TextView 
	android:id="@+id/name"
	android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@{user.firstName}" />
複製代碼

3. 在activity中使用

Android 開發者官方文檔上說,當你建立了一個databinding類型的佈局文件後,gradle 編譯器會自動生成一個與之對應的綁定類。ide

綁定類的命名規則爲:駝峯化xml文件名 + Binding.java佈局

在activity中的獲取方式爲:gradle

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
複製代碼

有了binding對象後你就能夠直接使用佈局文件中的控件了:ui

// 控件的變量名就是佈局文件中的id名
binding.name.setBackgroundColor(Color.WHITE);
複製代碼

固然咱們並不須要手動爲每一個空間賦值,只須要:

User user = new User("Test", "User");
binding.setUser(user);
複製代碼

點擊事件

點擊事件的監聽有兩種方法:

  1. 直接調用方法。這種跟以前在activity裏設置onclick有些相似,註冊的方法必須是onClick(View view)形式的帶着View參數的,使用方法是:
android:onClick="@{objectName::funName}"
複製代碼
  1. 綁定監聽器。這種方法對於註冊的方法沒有任何要求,有參數沒有參數的,參數類型是什麼樣的都沒有限制,使用方法是:
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>的佈局轉換爲對應的綁定類。

相關文章
相關標籤/搜索