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的代理。