这篇之前在简书上面发布的blog,由于不打算在简书上面写东西了,就搬过来这里。
之前曾经发布过一篇blog来记录之前使用DataBinding的一些心得体会,当时对于DataBinding的双向绑定简单提了一下。现在对这个双向绑定有了进一步的了解,于是继续分享。
回顾
我们先来回顾一下之前双向绑定的做法:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:text="@={item.price}"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{item.price}"/>
这里就只是通过使用* “@={}”*就完成了EditText
和Button
的文本属性的双向绑定。这里面隐藏了什么秘密呢?直接打开源码来看下吧;
隐藏起来的秘密
EditText
和Button
继承TextView
,我们可以在TextViewBindingAdapter
里面看到Goolge工程师对android:text
这个属性做了什么处理。打开源码,首先就被下面这段代码吸引了目光(反正我就被吸引了):
@InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged")
public static String getTextString(TextView view) {
return view.getText().toString();
}
虽然很疑惑这个@InverseBindingAdapter
注解的作用,不过还是先把相关源码的逻辑找出来吧:
@BindingAdapter(value = {
"android:beforeTextChanged", "android:onTextChanged",
"android:afterTextChanged", "android:textAttrChanged"}, requireAll = false)
public