JetPack DataBinding原理分析2

192 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

d.VM实现

      数据绑定框架提供了可观察的变量,像ObservableInt,ObservableBoolean来替代原始数据类型int,boolean,使其具备可观察能力。提供了ObservableField来替代引用数据类型,使其具备可观察能力。具体的代码实现如下:

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.View;

import androidx.databinding.ObservableField;
import androidx.databinding.ObservableInt;

public class ViewModel {

    private Context mContext;
    public ViewModel(Context context) {
        step.set(1);
        mContext = context;
        updateImageInfo(step.get());
    }
    //定义用到的可变变量类型
    public ObservableInt step = new ObservableInt();
    public ObservableField<Drawable> rightImageRes = new ObservableField<>();
    public ObservableField<String> rightImageName = new ObservableField<>();
    public ObservableField<String> rightImageDescription = new ObservableField<>();

    public void nextStep(View view) {
        step.set(step.get() + 1);
        updateImageInfo(step.get());
    }

    public void upStep(View view) {
        step.set(step.get() - 1);
        updateImageInfo(step.get());
    }
    //更新ObservableField对应的变量值
    private void updateImageInfo(int step) {
        rightImageRes.set(ModalData.getDrawable(mContext, step));
        rightImageName.set(ModalData.getImageName(mContext, step));
        rightImageDescription.set(ModalData.getImageDes(mContext, step));
    }
}

      DataBinding框架用在MVVM模式下,View是加载布局,ViewModel来处理布局对应的交互,Model是来加载数据。ViewModel从Model里面去数据,供UI显示。
最后加入Model模块:

e.Model实现

import android.content.Context;
import android.graphics.drawable.Drawable;

public class ModalData {

    public static Drawable getDrawable(Context context, int index) {
        if (index == 1) {
            return context.getResources().getDrawable(R.drawable.ic_chuancai);
        } else if (index == 2) {
            return context.getResources().getDrawable(R.drawable.ic_lucai);
        } else {
            return context.getResources().getDrawable(R.drawable.ic_xiangcai);
        }
    }

    public static String getImageName(Context context, int index) {
        if (index == 1) {
            return context.getResources().getString(R.string.chuancai);
        } else if (index == 2) {
            return context.getResources().getString(R.string.lucai);
        } else {
            return context.getResources().getString(R.string.xiangcai);
        }
    }

    public static String getImageDes(Context context, int index) {
        if (index == 1) {
            return context.getResources().getString(R.string.chuancaides);
        } else if (index == 2) {
            return context.getResources().getString(R.string.lucaides);
        } else {
            return context.getResources().getString(R.string.xiangcaides);
        }
    }
}
f.事件绑定

      事件绑定也是一种变量绑定,只不过设置的变量是回调接口而已。
点击TextView响应,在view里面的操作如下:

TextView tv = view.findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          upStep();
      }
});

      使用databinding后,可以在布局文件中将TextView的onClick属性加入执行方法即可,当TextView点击后,会执行相应的方法。

<TextView
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:onClick="@{guide::upStep}"
    android:text="@string/up"
    android:visibility="@{guide.step!=1?View.VISIBLE:View.INVISIBLE}"