Android双向数据绑定用于带参数的方法

Мак*_*люк 2 android inverse two-way android-databinding two-way-binding

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

public int getPrice(Object key) {
}

public void setPrice(Object key, int price) {
}
Run Code Online (Sandbox Code Playgroud)

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)}"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

但是在这种情况下,我有下一个错误。

error: @InverseMethods must have a non-void return type
Run Code Online (Sandbox Code Playgroud)

因此,我很高兴在这里对整个流程进行很好的解释。谢谢

Geo*_*unt 5

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

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

本质上,将文本设置为视图时,数据绑定使用如下代码:

EditText edit = binding.edtPrice;
edit.setText(shipper.getPrice(priceKey));
Run Code Online (Sandbox Code Playgroud)

当文本更改时,您要求它执行以下操作:

EditText edit = binding.edtPrice;
priceKey = shipper.setPrice(priceKey, edit.getText());
Run Code Online (Sandbox Code Playgroud)

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

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

在您的情况下,您不打算将priceKey转换为整数;您正在尝试访问某种映射中的值。有几种方法可以解决此问题。我认为最简单的方法是直接在模型中使用地图。在这里,我假设您有一个final字段,但是您可以使用getter和setters将其作为属性返回:

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

然后在您的表情中:

<EditText android:text="@={`` + shipper.price[priceKey]}" .../>
Run Code Online (Sandbox Code Playgroud)

如果要进行自定义转换,可以这样进行:

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

public int convertToPrice(Object key, String text) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在表达式中传递price对象:

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

我将简化转换方法,以使其在整个应用程序中可重用,然后将整数转换为String并返回:

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

  public static final String fromPrice(int price) {
    //...
  }
}
Run Code Online (Sandbox Code Playgroud)

然后表达式将是:

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