Как обновить TextView во фрагменте из второго занятия, используя LiveData? - PullRequest
0 голосов
/ 24 января 2020

У меня есть фрагмент, который запускает второе действие после некоторого нажатия кнопки. Это второе действие, где пользователь делает некоторые выборы. Я хочу обновить 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 }
        }
    }
}
...