DataBinding
DataBinding是Google推出的用于完成数据绑定,实现MVVM架构的工具。
Data Binding Library官方给出的向导很详细的讲述了DataBinding如何使用的,但是却没有提到双向绑定,本文接下来将通过自定义一个View,使其能支持双向绑定的display属性来讲解自定义双向绑定属性的过程。
关键点
第零步
在写代码之前,先分析完成一个支持双向绑定的属性需要什么。
- 需要属性的getter和setter方法。
- 需要属性发生变化时触发回调。
第一步
由于View默认没有办法设置VisibilityChange监听,所以需要简单的对View进行一些改造:
- 重写
onVisibilityChanged
方法 - 提供一个
setVisibilityChangeListener
方法。
private OnVisibilityChangeListener mListener;
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (mListener != null) {
mListener.onChange();
}
}
public void setVisibilityChangeListener(OnVisibilityChangeListener listener) {
mListener = listener;
}
public interface OnVisibilityChangeListener {
void onChange();
}
第二步
使用BindingAdapter
注解设置display属性的setter函数,注解参数value是在xml中对应的属性名,方法的第一个参数是需要设置属性的view,第二个参数是需要设置的属性值。
@BindingAdapter(value = "display")
public static void setDisplay(CustomView view, boolean isDisplay) {
view.setVisibility(isDisplay ? View.VISIBLE : View.INVISIBLE);
}
第三步
用InverseBindingAdapter
定义getter函数。
@InverseBindingAdapter(attribute = "display", event = "displayAttrChanged")
public static boolean isDisplay(CustomView view) {
return view.getVisibility() == View.VISIBLE;
}
attribute是xml中的属性名,event是设置属性监听的属性名,类型是InverseBindingListener。
第四步
使用BindingAdapter
注解设置与第三步中event值相同的回调函数的setter函数。
@BindingAdapter(value = "displayAttrChanged")
public static void setChangeListener(CustomView view, InverseBindingListener listener) {
view.setVisibilityChangeListener(listener::onChange);
}
第五步
在xml中使用@={}
语法
<CustomView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:display="@={isDisplay}" />
于是就可以使用isDisplay控制view的显示和隐藏,并且当view可见状态改变时isDisplay值也会随之改变。