【问题标题】:Databinding via Interface通过接口进行数据绑定
【发布时间】: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&lt;Integer&gt; 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


    【解决方案1】:

    如果您想将任何想要绑定到视图的变量包装在 LiveData 中,Android 会自动将数据拆箱并将其绑定到视图

    【讨论】:

      【解决方案2】:

      数据绑定需要 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 setter,所以不能作为模型使用。

      【讨论】:

      • 顺便问一下,为什么要把这个变量放在 ViewModel 中,是否应该放在 Model 类中? ViewModel 用于保存相关数据,例如模型或侦听器。
      • 数据绑定绝对不需要 getter 来访问 ObservableField,只要它是公共的。否则我的第一个 ViewModel 也不起作用,但它确实起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2015-10-07
      • 2011-08-02
      • 2019-07-30
      相关资源
      最近更新 更多