Android数据绑定:BindingAdapter与InverseBindingAdapter

时间:2017-08-12 21:07:48

标签: android android-databinding

两者有什么区别?

何时应该使用其中一种?

当我定义BindingAdapter时,我是否必须创建反转?

1 个答案:

答案 0 :(得分:3)

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

  

双向绑定适用于以下情况   将数据存储在模型中的方法可以很好地与getter一起存储   和相关小部件的setter。模型中的boolean字段   适用于已检查的属性   CompoundButton的{​​{1}}与Switch一样CompoundButton   返回isChecked()boolean的{​​{1}}方法   接受setChecked()

     

boolean允许您在数据之间创建其他映射   类型和属性,但仅适用于经典模型 - >视图绑定。   为了在相反的方向完成同样的事情,你结束了   创建BindingAdapter。顾名思义,这是有用的   与InverseBindingAdapter具有相同的基本作用,但在相反的方向,   从小部件中获取数据并使用自定义为模型做好准备   码。在这里,“为模型做准备”意味着将其转换为   适合您的setter,BindingAdapter字段等的合适数据类型   模型。

     

这很不寻常。

     

在某些地方使用的例子是“如果我   想要将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 setter不属于数据绑定知道如何自行处理的属性。

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

  

何时应该使用其中一种?当我定义一个BindingAdapter时,我是否必须创建一个反向?

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

如果您这样做,要进行双向绑定,用户在UI中的更改会自动更新您的视图模型,很可能您需要匹配EditText从属性(例如,InverseBindingAdapter的文本)转换为所需的数据类型(例如,EditText)。