1. 程式人生 > 其它 >安卓資料繫結 DataBinding 結合ViewModel

安卓資料繫結 DataBinding 結合ViewModel

技術標籤:android安卓android

介紹

通過資料繫結安卓可以實現類似於Vue的Mvvm(Model-View-ViewModel)功能,可以極大減少程式碼和邏輯負擔。
官網描述

使用

  1. 配置

在build.gradle中寫入以下程式碼來啟用資料繫結

android {
    ...
    dataBinding {
        enabled = true
    }
}
  1. xml配置

開啟 activity_main.xml 滑鼠移入左上角 轉換為data binding layout檢視
轉換為資料繫結檢視
轉換後是這樣的:
在這裡插入圖片描述

  1. 建立資料來源

資料來源用ViewModel來建立

MyViewModel.java

public class MyViewModel extends ViewModel {
   MutableLiveData<Integer> aTeamScore;
   int aBack;
   public MutableLiveData<Integer> getaTeamScore() {
       if(aTeamScore == null){
           aTeamScore = new MutableLiveData<>();
           aTeamScore.setValue(
0); } return aTeamScore; } public void aTeamAdd(int p){ aBack = aTeamScore.getValue(); aTeamScore.setValue(aTeamScore.getValue()+p); } }
  1. 在activity中設定資料繫結檢視和資料來源

public class MainActivity extends AppCompatActivity {
   //資料繫結的資料
   MyViewModel myViewModel;
   //資料繫結的檢視
ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); //不能再用原來的設定檢視了 binding = DataBindingUtil.setContentView(this,R.layout.activity_main); myViewModel = new ViewModelProvider(this,new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class); binding.setData(myViewModel); binding.setLifecycleOwner(this); } }
  1. 把資料和方法與xml檢視繫結

在data中設定資料

<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="data"
           type="com.yangliwei.demo5.MyViewModel" />
   </data>
   ....
   </layout>

佈局中的表示式使用“@{}”語法寫入特性屬性中。

//資料
<TextView android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="@{user.firstName}" />
//方法
 <Button  android:id="@+id/gAddOne"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/add1"
            android:onClick="@{()->data.aTeamAdd(1)}" />