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值也會隨之改變。