Я изучаю Android + Kotlin и делаю простой пример, чтобы понять LiveData + ViewModel.Это очень просто: у меня есть одно корневое действие и два фрагмента.FragmentOne имеет два editText.Эти значения суммируются, и мне нужно передать результат в ViewModel.Затем я использую наблюдаем как в корневой активности, так и во FragmentTwo, чтобы увидеть измененные данные.
FragmentOne
class FragmentOne: Fragment() {
private val model by lazy { ViewModelProviders.of(activity).get(MyViewModel::class.java) }
var resultSum:Int = 0
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater?.inflate(R.layout.fragment_one,container,false)
val btn = view?.findViewById<Button>(R.id.sendToModel)
btn?.setOnClickListener({
val field1 = n1.text.toString().toInt()
val field2 = n2.text.toString().toInt()
resultSum = field1 + field2
model.update()
})
return view
}
}
viewModel
class MyViewModel: ViewModel() {
private val fragment by lazy {FragmentOne()}
private var _result = MutableLiveData<Int>().apply { value = 0 }
val result: LiveData<Int>
get() = _result
fun update(){
_result.value = fragment.resultSum
}
}
Активность корня наблюдателя
private val resultModel by lazy {ViewModelProviders.of(this).get(MyViewModel::class.java)}
resultModel.result.observe(this, Observer { result -> resultTxt.text = result.toString()})
Фрагмент наблюдателяДва
private val resultModel by lazy {ViewModelProviders.of(activity).get(MyViewModel::class.java)}
resultModel.result.observe(this, Observer { result -> resultTxt.text = result.toString()})
Я проверил var resultSum
(Журнал) и Itудерживать значение Int из суммы.Наблюдатель тоже работает (если я создаю экземпляр result.value
внутри ViewModel, это значение заметно для активности и фрагмента)
Я ценю любую помощь.