【发布时间】:2018-10-05 10:57:47
【问题描述】:
我有一个简单的数据绑定设置:
我的视图模型:
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 值的更改不会反映在布局中。
我做错了什么还是数据绑定不能(完全)使用接口作为视图模型?
【问题讨论】:
标签: android android-layout android-databinding