为什么只能通过在应该具有新值的方法中提供模型来读取 android 中双向 DataBinding 的值?

Why values from two way DataBinding in android can be read only by providing model in method which should have new values?

我有 ViewModel:

public class CalculatorViewModel implements CalculatorMVVM.ViewModel {

    private static final String TAG = CalculatorViewModel.class.getSimpleName();

    private CalculatorMVVM.Model model;

    public CalculatorViewModel(CalculatorMVVM.Model model) {
        this.model = model;
    }

    public ObservableField<Double> price = new ObservableField<>(1.0);
    public ObservableField<Double> quantity = new ObservableField<>(1.0);

    @Override
    public void onButtonClick(CalculatorMVVM.ViewModel viewModel) {
        Log.d(TAG, "onButtonClick: price = " + viewModel.price.get() + ", quantity = " + viewModel.quantity.get());
    }
}

ViewModel 具有 onButtonClick 方法,它应该能够读取新的、更改的值。

在布局中我有 data 部分:

<data>
    <variable name="viewModel" type="CalculatorMVVM.ViewModel"/>
</data>

以及其他字段,如:

<EditText
    android:id="@+id/editPrice"
    ...
    android:text="@={viewModel.price}"
    />


<EditText
    android:id="@+id/editQuantity"
    ....
    android:text="@={viewModel.quantity}"
     />

<Button
    android:id="@+id/button"
    ...
    android:onClick="@{() -> viewModel.onButtonClick(viewModel)}"
    />

那么,我的问题是:

当我已经在调用那个特定对象的方法时,为什么我必须为我的 onButtonClick 方法提供 viewModel? 当我尝试这样做时(调用没有 viewModel 参数的方法),我只收到这些字段的默认值,即使它们在单击该按钮之前已更改。

如果你想摆脱冗余,你可以简单地这样做:

<data>
    <import type="com.example.Conversion"/>
    <variable
       name="viewModel"
       type="com.example.ViewModel" />
</data>

<EditText
    android:id="@+id/editPrice"
    ...
    android:text="@={Conversion.toString(viewModel.price)}"
    />


<EditText
    android:id="@+id/editQuantity"
    ....
    android:text="@={Conversion.toString(viewModel.quantity)}"
     />

<Button
    android:id="@+id/button"
    ...
    android:onClick="@{() -> viewModel.onButtonClick()}"
    />

Conversion.Java

public class Conversion {

    @InverseMethod("toDouble")
    public static String toString(Double doubleNum) {
        return doubleNum == 0.0 ? null : String.valueOf(doubleNum);
    }

    public static Double toDouble(String string) {
        return string.isEmpty() ? 0.0 : Double.parseDouble(string);
    }
}

ViewModel.Java

public ObservableField<Double> price = new ObservableField<>(1.0);
public ObservableField<Double> quantity = new ObservableField<>(1.0);

    @Bindable
    public Double getPrice() {
        return price.get();
    }

    @Bindable
    public Double getQuantity() {
        return quantity.get();
    }

    public void setPrice(Double price) {
        if(getPrice() == price) return;
        this.price.set(price);
    }

    public void setQuantity(Double quantity) {
        if (getQuantity()==quantity) return;
        this.quantity.set(quantity);
    }

    public void onButtonClick() {
        Log.d("onButtonClick", "price = " + price.get() + ", quantity = " + quantity.get());
    }

而且你还需要处理java.lang.NumberFormatException