我在片段中声明了以下viewModel:
class NoteDetailsFragment : Fragment() {
private lateinit var noteDetailsViewModel:NoteDetailsViewModel
private lateinit var binding: FragmentNoteDetailsBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val application= requireNotNull(this.activity).application
val args=NoteDetailsFragmentArgs.fromBundle(requireArguments())
val noteDetailsViewModelFactory=NoteDetailsViewModelFactory(application,args.noteId)
noteDetailsViewModel=ViewModelProvider(requireActivity(),noteDetailsViewModelFactory).get(NoteDetailsViewModel::class.java)
}
,我有一个onOptionItemSelected菜单,我想在其中更新以下视图模型:
android.R.id.home -> {
noteDetailsViewModel.saveNote()
findNavController().navigateUp()
true
}
我的问题是,当用户更新xml布局时,我的viewModel没有更新。您可以在其中看到要更新的viewModel代码
fun saveNote() {
if (titleEditText.value.isNullOrEmpty() || descriptionEditText.value.isNullOrEmpty()) {
} else {
updateNote()
viewModelScope.launch {
if (noteIdentifier == null) {
repository.insertNote(editableNote)
} else {
repository.updateNote(editableNote)
}
}
}
}
fun updateNote() {
editableNote.apply {
title = titleEditText.value!!
Log.i(TAG,"The title is $title")
description = descriptionEditText.value!!
}
}
titleEditText和descriptionEditText是mutableLiveData,我正在使用数据绑定来设置xml布局,我不知道为什么我的updateNote函数没有使用UI中的最新值来更新editableNote对象
这是我的绑定代码:
binding = FragmentNoteDetailsBinding.inflate(inflater, container, false)
binding.lifecycleOwner=this
binding.viewModel=noteDetailsViewModel
您还可以检查我的布局
<data>
<variable
name="viewModel"
type="com.example.reminderapp.ui.notedetails.NoteDetailsViewModel" />
</data>
<LinearLayout
style="@style/Theme.AppCompat.Light"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/app_background_color"
android:orientation="vertical"
android:theme="@style/Theme.AppCompat.Light">
.......
<EditText
android:id="@+id/note_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/default_view_margin"
android:text="@{viewModel.titleEditText}"
android:background="@android:color/transparent"
android:hint="@string/enter_title"
android:minHeight="@dimen/toolbar_height"
android:textColor="#000"
android:textStyle="bold"
android:textSize="22sp" />
...
答案 0 :(得分:0)
您可以为此使用双向数据绑定。尝试使用此android:text =“ @ = {viewModel.titleEditText}”而不是此android:text =“ @ {viewModel.titleEditText}。此外,您还应该编写@InverseBindingAdapter才能进行此工作。有关双向数据绑定的信息,请参见文档。>