我有一个简单的数据绑定设置:
我的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
值的更改不会反映在布局中。
我是在做错什么还是数据绑定不能(完全)在作为视图模型的接口上工作?
答案 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设置程序,所以不能将它们用作模型。