DataBinding
DataBinding是Google推出的用于完成數(shù)據(jù)綁定,實(shí)現(xiàn)MVVM架構(gòu)的工具。
Data Binding Library官方給出的向?qū)Ш茉敿?xì)的講述了DataBinding如何使用的,但是卻沒有提到雙向綁定,本文接下來(lái)將通過(guò)自定義一個(gè)View,使其能支持雙向綁定的display屬性來(lái)講解自定義雙向綁定屬性的過(guò)程。
關(guān)鍵點(diǎn)
第零步
在寫代碼之前,先分析完成一個(gè)支持雙向綁定的屬性需要什么。
- 需要屬性的getter和setter方法。
- 需要屬性發(fā)生變化時(shí)觸發(fā)回調(diào)。
第一步
由于View默認(rèn)沒有辦法設(shè)置VisibilityChange監(jiān)聽,所以需要簡(jiǎn)單的對(duì)View進(jìn)行一些改造:
- 重寫
onVisibilityChanged
方法 - 提供一個(gè)
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
注解設(shè)置display屬性的setter函數(shù),注解參數(shù)value是在xml中對(duì)應(yīng)的屬性名,方法的第一個(gè)參數(shù)是需要設(shè)置屬性的view,第二個(gè)參數(shù)是需要設(shè)置的屬性值。
@BindingAdapter(value = "display")
public static void setDisplay(CustomView view, boolean isDisplay) {
view.setVisibility(isDisplay ? View.VISIBLE : View.INVISIBLE);
}
第三步
用InverseBindingAdapter
定義getter函數(shù)。
@InverseBindingAdapter(attribute = "display", event = "displayAttrChanged")
public static boolean isDisplay(CustomView view) {
return view.getVisibility() == View.VISIBLE;
}
attribute是xml中的屬性名,event是設(shè)置屬性監(jiān)聽的屬性名,類型是InverseBindingListener。
第四步
使用BindingAdapter
注解設(shè)置與第三步中event值相同的回調(diào)函數(shù)的setter函數(shù)。
@BindingAdapter(value = "displayAttrChanged")
public static void setChangeListener(CustomView view, InverseBindingListener listener) {
view.setVisibilityChangeListener(listener::onChange);
}
第五步
在xml中使用@={}
語(yǔ)法
<CustomView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:display="@={isDisplay}" />
于是就可以使用isDisplay控制view的顯示和隱藏,并且當(dāng)view可見狀態(tài)改變時(shí)isDisplay值也會(huì)隨之改變。