一起养成写作习惯!这是我参与「掘金日新计划 · 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}"