Android databinding: BindingAdapter vs InverseBindingAdapter



两者有什么区别?

什么时候应该使用其中一种?

定义BindingAdapter时,是否必须创建逆向?

引用我自己的话,来自The Busy Coder's Guide to Android Development

双向绑定在以下情况下效果很好 在模型中存储数据的方式与getter非常一致 以及关联小部件的设置器。模型中的boolean字段 与选中的属性配合良好 像Switch一样的CompoundButton,就像CompoundButton一样 返回booleansetChecked()isChecked()方法 接受boolean.

BindingAdapter允许您在数据之间创建其他映射 类型和属性,但仅适用于经典的模型>视图绑定。 为了在相反的方向上完成同样的事情,你最终 创建InverseBindingAdapter.顾名思义,这服务于 与BindingAdapter相同的基本角色,但方向相反, 从小部件中获取数据并使用自定义为模型准备数据 法典。在这里,"为模型做准备"意味着将其转换为 适合二传手、Observable字段等的数据类型 型。

这是相当不寻常的。

某些地方使用的例子是"如果我 想把float绑在EditText上吗?TheInverseBindingAdapter看起来像这样:

@InverseBindingAdapter(attribute = "android:text")
public static float getFloat(EditText et) {
try {
return(Float.parseFloat(et.getText().toString()));
}
catch (NumberFormatException e) {
return(0.0f); // because, um, what else can we do?
}
}

问题是如果用户键入的内容无效 浮点数,如snicklefritz.parseFloat()将失败 用NumberFormatException.您应该让用户知道他们的 数据输入无效。但是,双向数据绑定不支持 这,默认值(例如,0.0f(被传递给模型 相反。

因此,要回答您的问题:

两者有什么区别?

BindingAdapter有助于填充数据类型和View资源库不是数据绑定知道如何自行处理的属性。

InverseBindingAdapter有助于在双向绑定中填充视图模型,其中数据类型和Viewgetter不是数据绑定知道如何自行处理的东西。

什么时候应该使用其中一种?当我定义绑定适配器时,我必须创建一个反向适配器吗?

当您所需的数据类型(例如,float(不是数据绑定必须知道如何填充到小部件属性(例如,android:textEditText(时,请使用BindingAdapter,但您仍然想绑定它。

如果您这样做,并且想要执行双向绑定,其中 UI 中的用户更改会自动更新您的视图模型,则很可能您需要一个匹配的InverseBindingAdapter才能从属性(例如,EditText的文本(转换为所需的数据类型(例如,float(。

最新更新