У меня есть фрагмент, который запускает второе действие после некоторого нажатия кнопки. Это второе действие, где пользователь делает некоторые выборы. Я хочу обновить TextView во фрагменте на основе выбора пользователя из второго действия. Я использую ViewModelFactory для того, чтобы получить доступ к той же ViewModel во фрагменте из второго действия (из решения от Амира Раза, найденного по адресу: Android LiveData - как повторно использовать одну и ту же модель представления в различных действиях? )
Но TextView не обновляется.
Я нашел ответы здесь:
Обновление textView во фрагменте из действия
Но этот ответ не использует LiveData.
Фрагмент:
class CreatePlanFragment : Fragment()
{
private lateinit var vmCreatePlan: NameViewModel
...
vmCreatePlan = ViewModelProviders.of(this, ViewModelFactory.getInstance()).get(NameViewModel::class.java)
val tvStartReference: TextView = view.findViewById(R.id.create_plan_start_ref)
vmCreatePlan.referenceStart.observe(this, Observer {
tvStartReference.text = it
})
}
Второе действие:
class ActivitySelectReference : AppCompatActivity()
{
private lateinit var vmCreatePlan: NameViewModel
...
vmCreatePlan = ViewModelProviders.of(this, ViewModelFactory.getInstance()).get(NameViewModel::class.java)
reference_button_ok.setOnClickListener {
vmCreatePlan.referenceStart.postValue("New Label")
//vmCreatePlan.referenceStart.value ="New Label"
finish()
}
}
ViewModel:
class NameViewModel : ViewModel()
{
val referenceStart: MutableLiveData<String> = MutableLiveData<String>().apply {
value = "Old Label"
}
companion object
{
private var instance: NameViewModel? = null
fun getInstance() = instance ?: synchronized(NameViewModel::class.java) {
instance ?: NameViewModel().also { instance = it }
}
}
}
ViewModelFactory:
class ViewModelFactory : ViewModelProvider.NewInstanceFactory()
{
override fun <T : ViewModel?> create(modelClass: Class<T>) = with(modelClass) {
when
{
isAssignableFrom(NameViewModel::class.java) -> NameViewModel.getInstance()
else -> throw IllegalArgumentException("Unknown viewModel class $modelClass")
}
} as T
companion object
{
private var instance: ViewModelFactory? = null
fun getInstance() = instance ?: synchronized(ViewModelFactory::class.java) {
instance ?: ViewModelFactory().also { instance = it }
}
}
}