通过接口进行数据绑定

时间:2018-10-05 10:57:48

标签: android android-layout android-databinding

我有一个简单的数据绑定设置:

我的ViewModel:

public class MyViewModel {

    public ObservableField<Integer> viewVisibility = new ObservableField<>(View.VISIBLE);

    public void buttonClicked() {
        if (viewVisibility.get() == View.GONE) {
            viewVisibility.set(View.VISIBLE);
        } else {
            viewVisibility.set(View.GONE);
        }
    }
}

和布局:

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <data>

        <variable
            name="viewModel"
            type="com.example.fweigl.playground.MyViewModel" />

    </data>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="64dp">

        <View
            android:visibility="@{viewModel.viewVisibility}"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:background="#00ff00" />

        <Button
            android:text="click me"
            android:onClick="@{() -> viewModel.buttonClicked()}"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>
</layout>

如您所见,每次单击按钮都会在视图模型上切换ObservableField<Integer> viewVisibility,这反过来又会切换绿色矩形的可见性。 这很好。

现在,我想做同样的事情,但是使用界面作为视图模型:

public interface IMyViewModel {

    public void buttonClicked();

    public ObservableField<Integer> viewVisibility = new ObservableField<>(View.VISIBLE);

}

视图模型:

public class MyViewModel implements IMyViewModel {
    @Override
    public void buttonClicked() {
        if (viewVisibility.get() == View.GONE) {
            viewVisibility.set(View.VISIBLE);
        } else {
            viewVisibility.set(View.GONE);
        }
    }
}

在布局中,我导入接口而不是实现:

<data>

    <variable
        name="viewModel"
        type="com.example.fweigl.playground.IMyViewModel" />

</data>

起作用的是单击按钮的绑定,调用buttonClicked并更改viewVisibility的值。

不起作用是绿色矩形视图可见性的更改。 viewVisibility值的更改不会反映在布局中。

我是在做错什么还是数据绑定不能(完全)在作为视图模型的接口上工作?

2 个答案:

答案 0 :(得分:0)

您要在LiveData <>中包装要绑定到视图的变量,Android会自动将数据拆箱并将其绑定到视图

答案 1 :(得分:0)

数据绑定需要getter和setter才能完成工作,它不会直接访问您的字段。因此,如果没有getter setter,这也将不起作用

public class MyViewModel {

    public ObservableField<Integer> viewVisibility = new ObservableField<>(View.VISIBLE);

    public void buttonClicked() {
        if (viewVisibility.get() == View.GONE) {
            viewVisibility.set(View.VISIBLE);
        } else {
            viewVisibility.set(View.GONE);
        }
    }
}

因此,因为接口没有getter设置程序,所以不能将它们用作模型。