我面临着android中数据绑定库的一个奇怪问题。在我的todo应用程序中,我想对添加任务表单使用双向数据绑定。这是我的模型,它被放入视图布局。
public class TaskFormModel extends BaseObservable {
private String title;
private String notes;
private String categoryUUID;
public Date dueDate;
public TaskFormModel() {
}
public TaskFormModel(String title, String notes, String categoryUUID, Date dueDate) {
this.title = title;
this.notes = notes;
this.categoryUUID = categoryUUID;
this.dueDate = dueDate;
}
/**
* Resets the current object
*/
public void reset() {
title = null;
notes = null;
categoryUUID = null;
dueDate = null;
notifyPropertyChanged(BR.title);
notifyPropertyChanged(BR.notes);
notifyPropertyChanged(BR.categoryUUID);
notifyPropertyChanged(BR.dueDate);
notifyPropertyChanged(BR.showError);
}
/**
* Determines if an error should be shown or not
*
* @return True if title is not null, but is empty. False otherwise
*/
@Bindable
public boolean isShowError() {
return title != null && title.trim().isEmpty();
}
@Bindable
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
notifyPropertyChanged(BR.title);
notifyPropertyChanged(BR.showError);
}
...
}
在我的布局中,我引用模型,如下面的代码片段
所示
<data>
<variable
name="taskFormModel"
type="de.einfachmachen.ui.addtask.form.TaskFormModel" />
</data>
<android.support.constraint.ConstraintLayout
android:id="@+id/task_overview_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize">
<TextView
android:id="@+id/headline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Headline"
android:text="@string/headline_add_task"/>
<android.support.design.widget.TextInputLayout
android:id="@+id/task_title_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/EditText"
app:errorEnabled="true"
app:error='@{taskFormModel.showError ? @string/error_task_title_missing : null}'
app:hintTextAppearance="@style/TextFloatLabelAppearance"
app:errorTextAppearance="@style/TextErrorAppearance"
android:layout_marginLeft="@dimen/spacing_large"
android:layout_marginRight="@dimen/spacing_large"
android:layout_marginBottom="@dimen/spacing_large"
app:layout_constraintTop_toBottomOf="@id/headline">
<android.support.design.widget.TextInputEditText
android:id="@+id/task_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Text"
android:inputType="textCapSentences"
android:lines="1"
android:text="@={taskFormModel.title}"
android:hint="@string/form_hint_title"/>
</android.support.design.widget.TextInputLayout>
...
<android.support.design.widget.FloatingActionButton
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_big"
android:backgroundTint="@color/white"
android:src="@mipmap/ic_launcher"
app:fabSize="normal"
app:borderWidth="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:rippleColor="@color/ripple_grey"/>
</android.support.constraint.ConstraintLayout>
如果用户单击FloatingActionButton
,则任务将存储在数据库中,并且TaskFormModel将通过其reset
方法重置。如您所见,reset
方法将类属性设置为null
,然后使用notifyPropertyChanged
更新视图。到目前为止一切正常。
但是如果我在调用TaskFormModel
方法后检查reset
的属性,则值不会设置为null
,它们的值为空字符串。因此,isShowError
方法返回true
,这会导致向用户显示表单错误。这是一种不理想的行为。
那么是不是可以通过数据绑定将class属性设置为null?是否有人经历过相同的行为并知道如何解决问题?提前谢谢。
p.s。:我还尝试为与TaskFormModel
的绑定设置一个全新的binding.setTaskFormModel(new TaskFormModel());
。没有不幸的是没有成功。