两者有什么区别?
什么时候应该使用其中一种?
定义BindingAdapter
时,是否必须创建逆向?
引用我自己的话,来自The Busy Coder's Guide to Android Development:
双向绑定在以下情况下效果很好 在模型中存储数据的方式与getter非常一致 以及关联小部件的设置器。模型中的
boolean
字段 与选中的属性配合良好 像Switch
一样的CompoundButton
,就像CompoundButton
一样 返回boolean
和setChecked()
的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
有助于在双向绑定中填充视图模型,其中数据类型和View
getter不是数据绑定知道如何自行处理的东西。
什么时候应该使用其中一种?当我定义绑定适配器时,我必须创建一个反向适配器吗?
当您所需的数据类型(例如,float
(不是数据绑定必须知道如何填充到小部件属性(例如,android:text
EditText
(时,请使用BindingAdapter
,但您仍然想绑定它。
如果您这样做,并且想要执行双向绑定,其中 UI 中的用户更改会自动更新您的视图模型,则很可能您需要一个匹配的InverseBindingAdapter
才能从属性(例如,EditText
的文本(转换为所需的数据类型(例如,float
(。