#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) }