DataBinding
是 Google
在 Jetpack
中推出的一款數據綁定的支持庫,利用該庫能夠實如今頁面組件中直接綁定應用程序的數據源。使其維護起來更加方便,架構更明確簡介。 DataBinding
是 MVVM
模式在 Android
上的一種實現,用於下降佈局和邏輯的耦合性,使代碼邏輯更加清晰。MVVM
相對於 MVP,其實就是將 Presenter 層替換成了 ViewModel
層。DataBinding
可以省去咱們一直以來的 findViewById()
步驟,大量減小 Activity 內的代碼,數據可以單向或雙向綁定到 layout 文件中,有助於防止內存泄漏,並且能自動進行空檢測以免空指針異常java
build.gradle
文件中添加 dataBinding
元素,以下:android { ... dataBinding { enabled = true } } 複製代碼
<data></data>
標籤來描述,在該標籤中添加<variable name="data" type="com.example.databinding.MyViewModel"/>
,這裏的name
描述了能夠在這個佈局中使用的屬性,type
則表示該屬性所屬類的詳細路徑,以下:<?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" /> 複製代碼
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); } } 複製代碼
ActivityMainBinding binding;
系統會爲每一個佈局文件生成一個綁定類。默認狀況下,類名稱基於佈局文件的名稱,它會轉換爲 Pascal 大小寫形式並在末尾添加 Binding 後綴。以上佈局文件名爲 activity_main.xml
,所以生成的對應類爲 ActivityMainBinding
。此類包含從佈局屬性(例如,number
變量)到佈局視圖的全部綁定,而且知道如何爲綁定表達式指定值。android
binding.setDate(myViewModel);
這裏是爲了設置咱們在xml
佈局中的數據,將其ViewModel
設置在其中,什麼date能夠直接調用ViewModel
中的屬性方法和方法markdown