两者有什么区别?
何时应该使用其中一种?
当我定义BindingAdapter
时,我是否必须创建反转?
答案 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
)。