【发布时间】:2015-10-27 07:57:27
【问题描述】:
我已经实现了新的Android数据绑定,实现后发现它不支持双向绑定。我试图手动解决这个问题,但我很难找到一个在绑定到 EditText 时使用的好的解决方案。 在我的布局中,我有这个视图:
<EditText
android:id="@+id/firstname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapWords|textNoSuggestions"
android:text="@{statement.firstName}"/>
另一个视图也在显示结果:
<TextView
style="@style/Text.Large"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{statement.firstName}"/>
在我的片段中,我创建这样的绑定:
FragmentStatementPersonaliaBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_statement_personalia, container, false);
binding.setStatement(mCurrentStatement);
这有效,并将 firstName 的当前值放入 EditText。问题是如何在文本更改时更新模型。我尝试在 editText 上放置一个 OnTextChanged-listener 并更新模型。这创建了一个循环杀死我的应用程序(模型更新更新 GUI,它调用 textChanged times infinity)。接下来,我尝试仅在发生真正的更改时通知:
@Bindable
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
boolean changed = !TextUtils.equals(this.firstName, firstName);
this.firstName = firstName;
if(changed) {
notifyPropertyChanged(BR.firstName);
}
}
这效果更好,但每次我写信时,GUI 都会更新,并且出于某种原因,编辑光标移到了前面。
欢迎提出建议
【问题讨论】:
-
你的吸气剂在哪里。有没有加
@Bindable注解? -
是的。现在将 getter 添加到描述中。
-
您总是调用
this.firstName = firstName,尽管它上面有布尔值。你研究过这个逻辑吗? -
它并没有真正影响绑定部分,但我明白你的意思。在我的解决方案中,布尔值已被删除。
标签: android android-edittext android-databinding