DataBinding 出現的目的旨在取代findViewById()
方法,可是它的功能不只如此。java
build.gradle
中開啓功能android { ... dataBinding { enabled = true } } 複製代碼
gradle.properties
中啓用新的編譯器android.databinding.enableV2=true 複製代碼
實現一個databinding基本上須要完成三個步驟的工做android
即普通的JavaBean對象。bash
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}" /> 複製代碼
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); 複製代碼
點擊事件的監聽有兩種方法:
onClick(View view)
形式的帶着View參數的,使用方法是:android:onClick="@{objectName::funName}" 複製代碼
android:onClick="@{() -> presenter.onSaveClick(task)}" 複製代碼
這是一個lamda表達式,小括號裏的view參數根據本身需求填不填均可以,就至關於在此處註冊了一個監聽器。
顯然第二種方法要更加的靈活,不只能夠根據須要傳遞任何參數,並且還不會強制要求註冊方法必須傳遞view參數。
在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>
的佈局轉換爲對應的綁定類。