安卓开发辅助技巧

DataBinding自定义双向绑定属性

2016-12-02  本文已影响1328人  chrnie

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值也会随之改变。

上一篇 下一篇

猜你喜欢

热点阅读