У меня есть две модели просмотра. Одна модель представления предназначена для флажка, а другая модель представления - для кнопки. Установка флажка должна активировать кнопку.
Я пытаюсь использовать 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 обновляется, и макет отражает это изменение.
Вот вещи, которые я пытался безрезультатно:
binding.setLifecycleOwner(getViewLifecycleOwner())
- postValue
- MediatorLiveData
enabled.addSource(checked)