【发布时间】:2017-08-12 21:07:48
【问题描述】:
两者有什么区别?
什么时候应该使用其中一个?
当我定义 BindingAdapter 时,我必须创建一个逆吗?
【问题讨论】:
标签: android android-databinding
两者有什么区别?
什么时候应该使用其中一个?
当我定义 BindingAdapter 时,我必须创建一个逆吗?
【问题讨论】:
标签: android android-databinding
引用我自己的话,来自The Busy Coder's Guide to Android Development:
双向绑定在以下情况下效果很好 将数据存储在模型中的方式与 getter 很好地对齐 和相关小部件的设置器。模型中的
boolean字段 与选中的属性配合良好CompoundButton像Switch一样,CompoundButton有 一个isChecked()方法返回一个boolean和一个setChecked()接受boolean。
BindingAdapter允许您在数据之间创建其他映射 类型和属性,但仅适用于经典模型->视图绑定。 为了在相反的方向完成同样的事情,你结束了 创建一个InverseBindingAdapter。顾名思义,这服务 与BindingAdapter的基本角色相同,但方向相反, 从小部件中获取数据并使用自定义为模型准备数据 代码。在这里,“为模型准备”意味着将其转换为 适合您的 setter、Observable字段等的数据类型 型号。这很不寻常。
有些地方用的例子是“如果我 想要将
float绑定到EditText?”。InverseBindingAdapter看起来像这样:
@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 不是数据绑定自己知道如何处理的东西。
什么时候应该使用其中一个?当我定义一个 BindingAdapter 时,我必须创建一个逆向吗?
当您想要的数据类型(例如,float)不是数据绑定必须知道如何填充到小部件属性(例如,EditText 上的 android:text)时,请使用 BindingAdapter,但是无论如何你都想绑定它。
如果您这样做,并且您想要进行双向绑定,用户在 UI 中的更改会自动更新您的视图模型,很可能您需要匹配的 InverseBindingAdapter 来转换从属性(例如,EditText 的文本)到所需的数据类型(例如,float)。
【讨论】: