Как наблюдать liveData из одной viewModel в другой viewModel (работает observableBoolean) - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть две модели просмотра. Одна модель представления предназначена для флажка, а другая модель представления - для кнопки. Установка флажка должна активировать кнопку.

Я пытаюсь использовать liveData для привязки атрибута макета "android: enabled" к кнопке.

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="buttonViewModel"
            type="com.example.myapp.ButtonViewModel" />

    </data>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:enabled="@{buttonViewModel.enabled}"/>
</layout>

enabled атрибут зависит от состояния флажка другого viewModel.

class CheckboxViewModel extends ViewModel 
{
    public final MutableLiveData<Boolean> checked = new MutableLiveData<>():
}

class ButtonViewModel extends ViewModel
{
    final MutableLiveData<Boolean> enabled = new MutableLiveData<>()
    // LiveData above does not update the layout. Changing to observableBoolean works.
    // final ObservableBoolean enabled = new ObservableBoolean();

    final Observer<Boolean> checkBoxObserver = this::shouldEnableButton;

    private void shouldEnableButton(Boolean enableButton)
    {
        enabled.setValue(enableButton);
        // I've tried postValue as well, but does not work
        // Changing enabled to ObservableBoolean works
    }
}


    buttonViewModel.checked.observeForever(buttonViewModel.checkBoxObserver);

Не уверен, что это правильный способ сделать это.

Когда я делаю viewModel.enabled объект MutableLiveData, он не обновить макет, когда включены изменения. Когда я изменяю его на ObservableBoolean, атрибут enabled обновляется, и макет отражает это изменение.

Вот вещи, которые я пытался безрезультатно:

  1. binding.setLifecycleOwner(getViewLifecycleOwner())
  2. postValue
  3. MediatorLiveData enabled.addSource(checked)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...