Android框架組件 DataBinding詳解及使用

概念

DataBindingGoogleJetpack 中推出的一款數據綁定的支持庫,利用該庫能夠實如今頁面組件中直接綁定應用程序的數據源。使其維護起來更加方便,架構更明確簡介。 DataBindingMVVM 模式在 Android 上的一種實現,用於下降佈局和邏輯的耦合性,使代碼邏輯更加清晰。MVVM 相對於 MVP,其實就是將 Presenter 層替換成了 ViewModel 層。DataBinding 可以省去咱們一直以來的 findViewById() 步驟,大量減小 Activity 內的代碼,數據可以單向或雙向綁定到 layout 文件中,有助於防止內存泄漏,並且能自動進行空檢測以免空指針異常java

步驟

1、啓用DataBinding
  • 要將應用配置爲使用數據綁定,請在應用模塊的 build.gradle 文件中添加 dataBinding 元素,以下:
android {
        ...
        dataBinding {
            enabled = true
        }
    }
複製代碼
2、佈局文件的配置
  • 在xml佈局中使用<data></data>標籤來描述,在該標籤中添加<variable name="data" type="com.example.databinding.MyViewModel"/>,這裏的name描述了能夠在這個佈局中使用的屬性,type則表示該屬性所屬類的詳細路徑,以下:
  • data 標籤的做用就像一個橋樑搭建了 View 和 Model 之間的通道
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="date"
            type="com.example.databinding.MyViewModel" />
    </data>
</layout>
複製代碼
  • 若是 date 類型要多處用到,也能夠直接將之 import 進來,這樣就不用每次都指明整個包名路徑了,而 java.lang.* 包中的類會被自動導入,因此能夠直接使用
<data>
        <import type="com.example.databinding.MyViewModel"/>
        <variable
            name="date"
            type="date"/>
    </data>
複製代碼
  • 在佈局中,要使用屬性則使用@{}將其屬性及方法寫入其中
<!--在標籤中使用屬性-->
<TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(date.number)}"
            app:layout_constraintVertical_bias="0.296" />
複製代碼
<!--在標籤中使用方法-->
<Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{()->date.add()}"
            android:text="Button" />
複製代碼
3、類文件的配置
  • 假設咱們有一個ViewModel類,用其來承載視圖的相關數據及方法,以下:
/** * @author iwen大大怪 * @Data 2020/3/7 15:13 */
public class MyViewModel extends ViewModel {
    private MutableLiveData<Integer> number;
    public MutableLiveData<Integer> getNumber() {
        if (number == null){
            number = new MutableLiveData<>();
            number.setValue(0);
        }
        return number;
    }
    public void add(){
        number.setValue(number.getValue()+1);
    }
}
複製代碼
  • 開始將數據與視圖雙向綁定
/** * @author iwen大大怪 * @Data 2020/3/7 14:13 */
public class MainActivity extends AppCompatActivity {
    MyViewModel myViewModel;
    // 建立一個binding對象
    ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        // 使用binding的DataBindingUtil.setContentView()方法綁定佈局
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        // 建立myViewModel對象
        myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        //myViewModel = new ViewModelProvider();
        // 將具體的值綁定進去,就是將 ViewModel 綁定進去
        binding.setDate(myViewModel);
        // 刷新
        binding.setLifecycleOwner(this);
    }
}
複製代碼
4、相關代碼解釋
  • ActivityMainBinding binding;

系統會爲每一個佈局文件生成一個綁定類。默認狀況下,類名稱基於佈局文件的名稱,它會轉換爲 Pascal 大小寫形式並在末尾添加 Binding 後綴。以上佈局文件名爲 activity_main.xml,所以生成的對應類爲 ActivityMainBinding。此類包含從佈局屬性(例如,number 變量)到佈局視圖的全部綁定,而且知道如何爲綁定表達式指定值。android

  • binding.setDate(myViewModel);

這裏是爲了設置咱們在xml佈局中的數據,將其ViewModel設置在其中,什麼date能夠直接調用ViewModel中的屬性方法和方法markdown

相關文章
相關標籤/搜索