Android:为什么当我编辑要使用dataBinding绑定的editText时,我的viewModel没有更新

时间:2020-07-20 22:30:43

标签: java android kotlin mvvm android-viewmodel

我在片段中声明了以下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" />
...

1 个答案:

答案 0 :(得分:0)

您可以为此使用双向数据绑定。尝试使用此android:text =“ @ = {viewModel.titleEditText}”而不是此android:text =“ @ {viewModel.titleEditText}。此外,您还应该编写@InverseBindingAdapter才能进行此工作。有关双向数据绑定的信息,请参见文档。