DataBinding

https://developer.android.google.cn/reference/android/databinding/package-summary

概览

Annotations

Bindable            被用于继承Observable类的get方法上,配合notifyPropertyChanged(BR.*)使用。

BindingAdapter      修饰静态方法,给View自定义属性,在方法内进行逻辑处理。如果与系统属性相同则覆盖系统的。

BindingConversion      修饰静态放方法,自动转换View的属性值。

<TextView  android:backgroud="@{@color/colorAccent}" /> 
@BindingConversion
public static ColorDrawable TestTest(int color){
    return new ColorDrawable(color+5000);
}

BindingMethod        在注解BindingMethods内使用。属性(attr)在databinding中 默认生成setAttr。有时候不匹配官方API.于是需要bindindMethod注解来声明正确的方法。三个参数:type: View的Class ; attribute: 需要被改写的属性 ; method: 改写后的方法。该注解会在DataBinding自动生成类时使用。

BindingMethods          修饰类,配合BindingMethod使用。

<ImageView android:tint="@{@color/colorAccent}" 
android:tintMode="@{User.tintMode}"
/>
//查看ImageViewBindingAdapter.java
@BindMethods({
    @BindingMethod(type = android.widget.ImageView.class , attribute= "android:tint" , method = "setImageTintList") ...
    })
public class ImageViewBindingAdapter{...}
//查看编译时生成类***Binding 的executeBindings()方法。
 this.mboundView3.setImageTintList()...
 this.mboundView3.setImageTintMode(userTintMode); //mboundView3是DataBinding为你的ImageView生成的对象名。

InverseBindingAdapter    与BindingAdapter类似,监听View属性变化去改变实体类属性值,用作双向绑定。

<TextView android:text=@{User.name}"/>
<MyEditText app:text="@={User.name}" />
public class MyEditTextAdapter {
    @BindingAdapter(value = {"text"}, requireAll = false)
    public static void setText(MyEditText aView, String value) {
        if (!value.equals(aView.getText().toString())) {
            aView.setText(value);
        }
    }
    @InverseBindingAdapter(attribute = "text", event = "textAttrChanged")
    public static String getText(MyEditText editText) {
        return editText.getText().toString();
    }
    @BindingAdapter(value = {"textAttrChanged"}, requireAll = false)
    public static void setTextAttrChanged(MyEditText editText, InverseBindingListener inverseBindingListener) {
        if (editText.getBindingListener() == null) {
            editText.setBindingListener(inverseBindingListener);
        }
    }
}
public class MyEditText extends EditText {
    private InverseBindingListener bindingLisener;

    public MyEditText(Context context) {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (bindingLisener != null) {
                    bindingLisener.onChange();
                }
            }
            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }
    public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    public void setBindingListener(InverseBindingListener bindingLisener) {
        this.bindingLisener = bindingLisener;
    }


    public InverseBindingListener getBindingListener() {
        return bindingLisener;
    }
}

InverseBindingMethods    用于枚举属性、getter和事件关联。值是InverseBindingMethod[ ]。

InverseBindingMethod    用于标识如何侦听对View属性的更改以及调用哪个getter方法。

参数 type:View的Class ; attribute:支持双向绑定的属性 ;  event: 用于通知数据绑定系统属性值已更改的事件。默认为attribute+"AttrChanged" ; method:从View中检索属性值的getter方法。默认方法名基于属性名。

<TextView android:text=@{User.name}"/>
<MyEditText app:value="@={User.name}" />
@InverseBindingMethods({@InverseBindingMethod(
        type = MyEditText.class,
        attribute = "value",
        event = "valueChanged",
        method = "getMyText")})

public class MyEditTextAdapter {

    @BindingAdapter(value = {"value"}, requireAll = false)
    public static void setText(MyEditText aView, String value) {
        if (!value.equals(aView.getText().toString())) {
            aView.setText(value);
        }
    }
}
public class MyEditText extends EditText {

    private InverseBindingListener inverseBindingListener;

    public MyEditText(Context context) {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (inverseBindingListener != null) {
                    inverseBindingListener.onChange();
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }

    public String getMyText() {
        return getText().toString().trim();
    }

    public void setValueChanged(InverseBindingListener inverseBindingListener) {
        this.inverseBindingListener = inverseBindingListener;
    }
}

InverseMethod    可以在任何双向数据绑定中使用的方法来声明逆方法,以声明从视图的属性值到绑定数据值时调用该方法的方法。

@InverseMethod("convertIntToString")
 public static int convertStringToInt(String value) {
     try {
         return Integer.parseInt(value);
     } catch (NumberFormatException e) {
         return -1;
     }
 }

 public static String convertIntToString(int value) {
     return String.valueOf(value);
 }


Interfaces

DataBindingComponent    此接口是在编译期间生成的,用于包含所有使用@BindingAdapter的实例

InverseBindingListener        当触发更改发生时,所有双向绑定实现的侦听器将被通知.

Observable                           可观察类提供了一种方法,可以将更改通知数据绑定UI。

ObservableList<T>              List改变时可以发起通知  

ObservableMap<K,V>        Map发生改变时发起通知


Classes

BaseObservable    Databinding实现的一个方便的类,实现Observable,提供notifyPropertyChange(int),notifyChange()方法

CallbackRegister<C,T,A>        用于存储和通知的回调。直接子类ListChangeRegistry,MapChangeRegistry,PropertyChangeRegistry 支持在通知期间对回调进行重入修改,而不会对通知造成不利影响。

CallbackRegistry.NotifierCallback    CallbackRegistry通知事件。

MergedDataBinderMapper    一种数据映射表,合并其他映射表。

实现了Observable的类    ObservableBoolean、ObservableByte、ObservableChar、ObservableDouble、ObservableFileld<T>、ObservableFloat、ObservableInt等。

PropertyChangeRegistry    管理观察者的回调callbacks。

ViewDataBinding    生成数据绑定类的基类。

ViewStubProxy      ViewStub的代理。




猜你喜欢

转载自blog.csdn.net/m0_37312601/article/details/80482135