数据绑定 - 将属性设置为null

时间:2018-04-29 13:58:49

标签: android data-binding android-textinputlayout 2-way-object-databinding

我面临着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());。没有不幸的是没有成功。

0 个答案:

没有答案