Android JetPack~ DataBinding(資料繫結)(一) 整合與使用

2023-02-16 06:00:38

近期將會梳理一下JetPack全家桶的使用,包括DataBinding,Room,ViewModel,LiveData,Navigation等。

本來打算先寫DataBinding的使用,沒想到在17年的時候已經寫過了,這裡就補充一點吧,畢竟不是什麼新東西

  1. Android資料繫結技術一,企業級開發
  2. Android資料繫結技術二,企業級開發
  3. Android  JetPack~ DataBinding(資料繫結)(一)    整合與使用
  4. Android  JetPack~ LiveData (一)   介紹與使用
  5. Android  JetPack~ ViewModel (一)   介紹與使用

目錄

  1. 介紹
  2. 整合到環境
  3. 在Activity、Fragment中使用
  4. BindingAdapter的使用

介紹

DataBinding(資料繫結)釋出於2015年的Google I/O大會,旨在減少Android開發中的大量模板程式碼,增加程式碼及邏輯清晰度,提高開發效率和維護效率。

它的好處顯而易見

  • 不用再findViewById(),我們直接可以在xml檔案進行屬性賦值
  • xml中可完成簡單的邏輯,如@{ xx==null? a ? b}
  • View與邏輯程式碼解耦性更高,資料與View雙向繫結,只需關注資料變化即可
  • .....

整合到環境

很早的時候是需要加入依賴的,不過現在只需要更新SDK,下載最新的Android Support庫即可。下面依賴僅供參考

設定工程的Gradle

android {
    …
    dataBinding {
        enabled = true
    }
}

在Activity、Fragment中使用

使Activity支援DataBinding,在佈局的最外層加入」<layout>」標籤即可,直接加在最外層,不會影響已有的程式碼。
acty_jpack_layout.xml這個檔名隨便起,但是後面會用到(系統會幫我生成ActyJpackLayoutBinding)
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/text_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:text="ceshi"/>

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

在Activity的onCreate方法中

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通過databinding 把activity和view繫結
        ActyJpackLayoutBinding mBinding = DataBindingUtil.setContentView(this,R.layout.acty_jpack_layout);
    }

在Fragment中onCreateView方法中

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mBinding = ActyJpackLayoutBinding.inflate(inflater);
    return mBinding.getRoot();
}

哦,對了,系統還提供其他的用法比如說,在ViewHolder中

class MyHolder extends RecyclerView.ViewHolder {
    MyBinding binding;
    MyHolder(View view) {
        super(view);
        binding = DataBindingUtil.bind(view);
    }
}

要獲取View的子View可以通過DataBindingUtil.getBinding(sunView);

 

BindingAdapter的使用

這個方法很好用,使用場景也很廣,比如說業務需要頁面中按鈕需要點選後縮放,擡起後還原。也可以載入圖片時用Glide框架去載入,而我們只需要在xml檔案中加一行程式碼就OK了。好處就是複用性極高,如果要優化圖片質量,只需要在ImageBindAdapter中修改,用到的地方自然就成修改後的。

public class ImageBindingAdapter {
    @BindingAdapter("imageUrl")
    public static void imageUrl(ImageView view, String imageUrl){
        RequestOptions options =
                new RequestOptions()
                .centerCrop()
                .dontAnimate();
        Glide.with(view)
                .load(imageUrl)
                .apply(options)
                .into(view);
    }

}

直接在xml檔案中使用

<ImageView
    android:layout_width="80dp"
    android:layout_height="80dp"
    app:imageUrl="@{bean.img}"
    />

結束!!!

這篇寫的很少,主要是之前寫過了,有需要可以結合之前兩篇。

下篇Android  JetPack ~ LiveData (一)   介紹與使用