DataBinding自定義雙向綁定屬性

DataBinding

DataBinding是Google推出的用于完成數據綁定,實現MVVM架構的工具。
Data Binding Library官方給出的向導很詳細的講述了DataBinding如何使用的,但是卻沒有提到雙向綁定,本文接下來將通過自定義一個View,使其能支持雙向綁定的display屬性來講解自定義雙向綁定屬性的過程。

關鍵點

  1. InverseBindingAdapter
  2. InverseBindingMethod
  3. InverseBindingMethods
  4. InverseBindingListener

第零步

在寫代碼之前,先分析完成一個支持雙向綁定的屬性需要什么。

  1. 需要屬性的getter和setter方法。
  2. 需要屬性發生變化時觸發回調。

第一步

由于View默認沒有辦法設置VisibilityChange監聽,所以需要簡單的對View進行一些改造:

  1. 重寫onVisibilityChanged方法
  2. 提供一個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值也會隨之改變。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容