使用Android数据绑定,我可以执行以下操作:

<View
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:onClick="@{() -> viewModel.onClick()}" />


我的ViewModel不必实现OnClickListener,而只需实现一个方法:

public void onClick() {

}


它传递给Xml中的onClick属性的东西对我来说就像一个lambda。

如何使用自己的BindingAdapters执行此操作?

我想要的是:
假设我想绑定触摸事件,并且想传递MotionEvent,我可以想象这样在Xml中看起来像这样:

<View
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:onTouch="(view, event) -> viewModel.onTouch(event)" />


BindingAdapter类似:

@BindingAdapter("onTouch")
public static void onTouch(View view, ??? lambda) {
  view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(final View v, final MotionEvent event) {
      return lambda(event);
    }
  });
}


我不希望ViewModel实现OnTouchListener并将其绑定为:

@BindingAdapter()
public  static  void onTouch(View view, View.OnTouchListener onTouchListener) {
    view.setOnTouchListener(onTouchListener);
}


而且我不想将touch事件直接绑定到我的ViewModel上,例如:

@BindingAdapter()
public static void onTouch(final View view, final MyViewModel myViewModel) {
  view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(final View v, final MotionEvent event) {
      return myViewModel.onTouch(view, myViewModel);
    }
  });
}


数据绑定可能吗?

最佳答案

可以将数据传递到视图模型,但是您还必须将视图与数据一起传递。所以在你的情况下。您需要做的如下。

<View
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:onClick="@{() -> viewModel.onClick(view.someData)}" />


并在您的视图模型中。

public void onClick(View v,String someData) {
}

关于java - 以lamba为参数的BindingAdapter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49999808/

10-12 04:12