如何用两个布局绑定对象?

时间:2016-10-27 10:34:43

标签: android mvvm data-binding observable

我有这样的模型

public class MyCheckedVM extends BaseObservable {
     @Bindable
ObservableBoolean observableBoolean = new ObservableBoolean();


@Bindable
public ObservableBoolean getObservableBoolean() {
    return observableBoolean;
}

@Bindable
public void setObservableBoolean(ObservableBoolean observableBoolean) {
    this.observableBoolean = observableBoolean;
}

public void onCheckChanged(CompoundButton view, boolean isChecked) {
    Log.d(TAG, "onCheckChanged");

}

这个模型我设置为主活动绑定ToggleButtonFragment里面也有这样的按钮

   <ToggleButton
    android:onCheckedChanged="@{viewModel.onCheckChanged}"
    android:checked="@{viewModel.observableBoolean}"
    android:id="@+id/toggle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

但是当我尝试点击任何按钮时,它们都会彼此独立地变化。将模型绑定到Fragmnet

可能是错误的
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
  FragmentExampleBinding fragmentExampleBinding =   DataBindingUtil.inflate(inflater, R.layout.fragment_example, container, false);

    fragmentExampleBinding.setViewModel(((MainActivity) getActivity()).getViewModel()); //getter in MainActivity for instance of viewModel

    return fragmentExampleBinding.getRoot();
}

1 个答案:

答案 0 :(得分:2)

我看到的一个问题是您使用setObservableBoolean。您有一个BaseObservable,因此如果您致电设置者,则应通知酒店更改。

但这只是因为你以不寻常的方式使用ObservableBoolean。最佳做法是始终将它们用作public final字段。如果这样做,则不需要使用BaseObservable作为基类:

public class MyCheckedVM {
    public final ObservableBoolean observableBoolean = new ObservableBoolean();

    public void onCheckChanged(CompoundButton view, boolean isChecked) {
        Log.d(TAG, "onCheckChanged");
    }
}

您可以在Observable类(或BaseObservable)中混合可观察字段。只需创建可观察字段public final,并确保在可绑定属性的setter中调用notifyPropertyChanged(BR.myField)