Android 带参数方法的双向数据绑定(bind)

标签 android android-databinding inverse two-way two-way-binding

模型的 Setter 和 getter 方法只有一个参数,如下所示:

public int getPrice(Object key) {
}

public void setPrice(Object key, int price) {
}

XML 看起来像这样:

<EditText
android:id="@+id/edtPrice"
style="@style/CreateShipperItemValueEditTextView"
android:layout_centerVertical="true"
android:hint="@string/hint_price"
android:inputType="number"
android:maxLines="1"
android:text="@={shipper.getPrice(priceKey)}"/>

android:text="@={shipper.getPrice(priceKey)}"

构建过程中的编译器错误表明我们应该使用 @InverseMethod 注释。 我尝试这样的事情:

@InverseMethod(value = "getPrice")
@Override
public void setPrice(Object key, int price) {
    super.setPrice(key, price);
}

但在这种情况下,我遇到了下一个错误。

error: @InverseMethods must have a non-void return type

所以我很高兴能在这里对整个流程进行很好的解释。谢谢

最佳答案

很高兴看到您正在使用 Android Studio 3.0 中提供的新 InverseMethod。

您正在使用带有方法的双向数据绑定(bind),并且表达式必须了解当用户修改文本时如何设置值。该用途旨在用于转换方法,因此我不知道这是否适用于您的情况。

本质上,数据绑定(bind)在将文本设置到 View 时使用如下代码:

EditText edit = binding.edtPrice;
edit.setText(shipper.getPrice(priceKey));

当文本发生变化时,您要求它执行以下操作:

EditText edit = binding.edtPrice;
priceKey = shipper.setPrice(priceKey, edit.getText());

这显然行不通,并且会给你一个错误。

确实有两件事是错误的。第一个是 getPrice() 返回一个 int 而不是 CharSequenceString。第二个是 setPrice() 并没有真正进行转换 - 它采用不同数量的参数并返回 void

在您的情况下,您并不是试图将 PriceKey 转换为整数;而是将其转换为整数。您正在尝试访问某种 map 中的值。有几种方法可以处理这个问题。我认为最简单的方法是直接在模型中使用 map 。在这里,我假设您有一个 Final 字段,但您可以使用 getter 和 setter 将其作为属性返回:

public class ShipperModel {
    public final ObservableArrayMap<Object, Integer> price = new ObservableArrayMap<>();
    //...
}

然后在你的表达式中:

<EditText android:text="@={`` + shipper.price[priceKey]}" .../>

如果您想要自定义转化,可以这样做:

@InverseMethod("convertToPrice")
public String convertFromPrice(Object key, int price) {
    //...
}

public int convertToPrice(Object key, String text) {
    //...
}

然后您将在表达式中传递价格对象:

<EditText android:text="@={shipper.convertFromPrice(priceKey, shipper.price)}" .../>

我会简化转换方法,使它们可以在我的应用程序中重复使用,只需将整数转换为字符串并返回:

public class Converters {
  @InverseMethod("fromPrice")
  public static final int toPrice(String text) {
      //...
  }

  public static final String fromPrice(int price) {
    //...
  }
}

然后表达式将是:

<EditText android:text="@={Converters.fromPrice(shipper.price[priceKey])}" .../>

关于Android 带参数方法的双向数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44769054/

相关文章:

android - Mopub 广告未显示

java - 在 android 上为对象设置动画后应用转换

使用 REST 或 SOAP 的 Magento 商店的 Android 应用程序?

android - java.lang.IllegalArgumentException : Invalid context argument error when logout 异常

Android 数据绑定(bind)不适用于 <merge> 属性

android - 如何在数据绑定(bind)库中收到通知?

android - 如何使数据绑定(bind)与 xml 属性一起工作?

algorithm - 反转乘积 bool 和的快速算法

java - hibernate中的cascade和inverse有什么区别,它们是干什么用的?

algorithm - cuda矩阵逆高斯乔丹