Как я могу сохранить пользовательский ввод из текстового поля в моем классе ViewModel?

#android #xml #kotlin #mvvm #android-room

#Android #xml #kotlin #mvvm #android-комната

Вопрос:

Я создал базу данных комнат в своем приложении для ведения журнала, следуя инструкциям. Я использовал привязку данных для привязки моей ViewModel к моим фрагментам и файлам макета XML. В моем классе ViewModel у меня есть функция OnSave, которая вызывает мою функцию вставки DAO. Я установил прослушиватель onclick так, чтобы моя функция OnSave вызывалась в моей ViewModel при нажатии кнопки сохранения.

Но мой пользовательский ввод никогда не попадает в ViewModel, поэтому OnSave просто ничего не сохраняет. Вот код:

 class TextEditorViewModel (val persistenceService: JournalEntryPersistenceService,
                            application: Application): AndroidViewModel(application) {
    // This is for canceling coroutines when viewModel is destroyed
    private var viewModelJob = Job()
    private val uiScope = CoroutineScope(Dispatchers.Main   viewModelJob)
    private var journalEntry = MutableLiveData<JournalEntryDataClass?>()
        init {
            initializeJournalEntry()
        }

    fun onSave(entry: JournalEntryDataClass) {
        uiScope.launch {
            persistenceService.insert(entry)
        }
    }
  

и

 class TextEditorFragment : Fragment() {

    private lateinit var binding: TextEditorFragmentBinding

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                                savedInstanceState: Bundle?): View? {

        binding = DataBindingUtil.inflate(inflater, R.layout.text_editor_fragment, container, false)
        val application = requireNotNull(this.activity).application
        val persistenceService = JournalEntryDatabase.getInstance(application).journalEntryPersistenceService


        val viewModelFactory = TextEditorViewModelFactory(persistenceService, application)
        val textEditorViewModel = ViewModelProvider(this, viewModelFactory).get(TextEditorViewModel::class.java)

        binding.setLifecycleOwner(this)
        binding.textEditorViewModel = textEditorViewModel

        var text = binding.journalEditTextBox.text.toString()
        var journalEntry = JournalEntryDataClass(text)

        binding.saveButton.setOnClickListener() { textEditorViewModel.onSave(journalEntry) }

        return binding.root
    }
}
  

Теперь мне стало известно, что мой текст journalEditTextBox присваивается при создании фрагмента и, следовательно, не содержит данных. Итак, я, по сути, отправляю пустую строку в свою функцию OnSave() . Но я чувствую себя совершенно потерянным относительно того, как я могу заставить это работать.

Ответ №1:

Вам нужно создать текст val внутри setOnClickListener.

     binding.saveButton.setOnClickListener() { 
    var text = binding.journalEditTextBox.text.toString()
    var journalEntry = JournalEntryDataClass(text) 
  textEditorViewModel.onSave(journalEntry) }