我已经实现了双向数据绑定,但没有达到预期的效果,所以这里是我的 XML片段 :
<EditText
android:id="@+id/name_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:layout_marginBottom="5dp"
android:ems="10"
android:text="@={taskViewModel.taskName}"
android:hint="Task name"
android:inputType="textPersonName"
android:textStyle="bold" />
<TextView
android:id="@+id/date_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:text="@={taskViewModel.taskDate}"
android:ems="10"
android:drawablePadding="5dp"
android:onClick="@{() -> listener.showDatePicker()}"
android:drawableRight="@drawable/ic_date"
android:hint="Pick a schedule date"
android:inputType="textPersonName"
android:textStyle="bold" />
<TextView
android:id="@+id/time_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:text="@={taskViewModel.taskTime}"
android:drawablePadding="5dp"
android:ems="10"
android:onClick="@{() -> listener.showTimePicker()}"
android:drawableRight="@drawable/ic_time"
android:hint="Pick a schedule time"
android:inputType="textPersonName"
android:textStyle="bold" />
基本上,我试图为上述widgets实现双向数据绑定。
我的ViewModel。
class TaskViewModel(private val repository: TaskRepository) : ViewModel() {
val taskName = MutableLiveData<String>()
val taskDate = MutableLiveData<String>()
val taskTime = MutableLiveData<String>()
/**
* Launching a new coroutine to insert the data in a non-blocking way
*/
fun insertTask() = viewModelScope.launch(Dispatchers.IO) {
val startDate = Calendar.getInstance().time
val scheduledDate = convertStringtoCalendar(taskDate.value, taskTime.value).time
val diffInTime = Util.calculateDateDifference(startDate , scheduledDate)
//User selected a proper date
if(diffInTime > 0) {
var newTask = Task(
taskName = taskName.value,
insertDate = Calendar.getInstance(),
scheduleDate = convertStringtoCalendar(taskDate.value, taskTime.value)
)
val insertRowId = repository.insert(newTask)
if (insertRowId > -1) {
statusMessage.postValue("Task Inserted Successfully $insertRowId")
newWordMutableLiveData.postValue(newTask)
taskName.postValue(null)
taskDate.postValue(null)
taskTime.postValue(null)
} else {
statusMessage.postValue("Error Occured")
newWordMutableLiveData.postValue(null)
}
insertRowIdMutableLiveData.postValue(insertRowId)
Log.d("InsertId", insertRowId.toString())
}else{
statusMessage.postValue("Scheduled time is less than current time.")
}
}
}
在这里你可以看到,我正在使用MutableLiveData设置为null。taskName.postValue(null)taskDate.postValue(null)taskTime.postValue(null)
但问题是,mutableLiveData的值被清除了,但textView的值却被清除了。s and EditText
的文字在布局中没有被清除。我需要清除它们。因为我将它们对应的MutableLiveData值设置为null,所以它们应该在insertTask()方法调用时被清除。但事实并非如此。我做错了什么?
找出解决方案。
最重要的部分是,在你的ActivityFragment中添加以下一行。
// Required to update UI with LiveData
dataBinding.setLifecycleOwner(this);