#android #kotlin #android-databinding #android-viewmodel #two-way-binding
#Android #kotlin #android-привязка к данным #android-viewmodel #двусторонняя привязка
Вопрос:
У меня есть один EditText
в моем фрагменте, я хочу двустороннюю привязку текстового значения EditText
к переменной ViewModel, чтобы я мог получить это текстовое значение в ViewModel для выполнения дополнительной работы.
ViewModel:
class MyViewModel @ViewModelInject constructor(
private val myRepository: MyRepository,
private val myPreferences: MyPreferences
) : ViewModel() {
val name = myPreferences.getStoredName()
fun buttonSubmit() {
viewModelScope.launch(Dispatchers.IO) {
myPreferences.setStoredName(name)
val response = myRepository.doSomething(name) // I can get the text value by name variable
}
}
xml:
<layout ...>
<data>
<variable
name="viewModel"
type=".MyViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
...>
<EditText
...
android:text="@={viewModel.name}" /> <!-- how to two-way binding name -->
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Комментарии:
1. Не забудьте добавить полное имя пакета, включая имя ViewModel, в XML-файл. Например, если ваша ViewModel хранится в «package com.example. YOURVIEWMODELNAME» ваш тип xml должен быть «com.example. YOURVIEWMODELNAME»
Ответ №1:
Вам просто нужно определить name
как MutableLiveData
. Таким образом, все текстовые изменения EditText
будут отражены в нем, и вы сможете прочитать значение в buttonSubmit
следующем виде: (ваш xml
контент правильный)
class MyViewModel @ViewModelInject constructor(
private val myRepository: MyRepository,
private val myPreferences: MyPreferences
) : ViewModel() {
val name = MutableLiveData(myPreferences.getStoredName())
fun buttonSubmit() {
viewModelScope.launch(Dispatchers.IO) {
myPreferences.setStoredName(name.value ?: "")
val response = myRepository.doSomething(name.value ?: "")
}
}
}