将单向DataBinding代码转为双向DataBinding,代码是否正确?
关于单向转双向DataBinding的代码问题分析
嘿,我来帮你梳理下这段代码的问题哈~
首先先看你原来的code1,这里面其实还有个小语法错误:if (!text equals(name name.get())应该改成if (!text.equals(name.get())),不过这不是重点,重点是你转双向绑定的思路。
然后看你写的code2,这里有两个明显的问题:
android:afterTextChanged="@={callback.change}"是错误写法:@=是双向DataBinding的专属语法,仅用于数据属性的双向绑定,而afterTextChanged是事件回调,不需要也不能加@=,直接写@{callback.change}就可以(不过其实双向绑定后这个回调大概率是多余的,后面会说原因)。- 当你给EditText的
text属性用了@={user.name}之后,双向DataBinding已经自动帮你完成了「EditText文本变化同步到user.name」和「user.name变化同步到EditText文本」这两个操作,所以原来手动写的afterTextChanged回调其实是重复的,甚至可能和双向绑定的自动逻辑冲突。
正确的双向绑定最简写法应该是这样的:
<EditText android:text="@={user.name}" />
这一行就足够实现完整的双向同步,不需要额外的afterTextChanged回调。
如果你的callback.change还有其他额外逻辑(比如除了更新name之外的校验、日志操作),那可以保留afterTextChanged,但要去掉@=,同时调整方法内的逻辑,避免重复更新name:
<EditText android:text="@={user.name}" android:afterTextChanged="@{callback.change}" />
public void change (Editable s ) { final String text = s.toString(); // 这里只保留除了更新name之外的额外逻辑,比如文本校验、埋点等 // 不需要再手动调用name.set(text),双向绑定已经自动处理了 }
内容的提问来源于stack exchange,提问作者Makiko
相关产品推荐
相关产品推荐

