为什么只能通过在应该具有新值的方法中提供模型来读取 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
我有 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