我现在正在尝试在我的项目中使用Android数据绑定,并遇到了这种问题,例如:我有3个复选框作为一个复选框组,如果第一个复选框被选中,则类型
变量将为1。第二个将使类型
变为2,第三个将使类型
变为3。所以我以这种方式实现了代码。
// layout.xml
<android.support.v7.widget.AppCompatCheckBox
android:layout_width="50dp"
android:layout_height="50dp"
android:checked="@{userInfoViewModel.type == 1}"
android:onCheckedChanged="@{(compoundButton, checked) -> userInfoViewModel.onTypeChecked(checked, 1)}"
/>
<android.support.v7.widget.AppCompatCheckBox
android:layout_width="50dp"
android:layout_height="55dp"
android:checked="@{userInfoViewModel.type == 2}"
android:onCheckedChanged="@{(compoundButton, checked) -> userInfoViewModel.onTypeChecked(checked, 2)}"
/>
<android.support.v7.widget.AppCompatCheckBox
android:layout_width="50dp"
android:layout_height="55dp"
android:checked="@{userInfoViewModel.type == 3}"
android:onCheckedChanged="@{(compoundButton, checked) -> userInfoViewModel.onTypeChecked(checked, 3)}"
/>
// viewModel
public void onTypeChecked(boolean checked, int i) {
if (checked) {
// if it is a check. set the type
type.set(i);
} else {
// if it is a uncheck. set type to unknown
type.set(0);
}
}
现在的问题是,如果我先勾选了第一个复选框,然后再勾选第二个复选框。type
应该设置为2,并且UI应该正确更新。但实际情况是,在type
设置为2之后,uncheck
事件也会在第一个复选框上触发,然后type.set(0)
被触发,因此没有任何复选框被选中。事实上,这个问题与onCheckedChanged called automatically是一样的。我需要的是数据绑定的解决方案。
在非数据绑定项目中,我认为最好的解决方案是使用
setCheckedSilent
(由@Emanuel Andrada提供的答案)。 public void setCheckedSilent(boolean checked) {
super.setOnCheckedChangeListener(null);
super.setChecked(checked);
super.setOnCheckedChangeListener(listener);
}
但是在数据绑定中,我无法做到这一点。所以有没有专家可以帮我解决?
根据@Arpan Sharma的答案,改为监听onClick
而不是onCheckedChanged
。这个解决方案目前有效,但我担心checked
的值是否总是正确的?
public void onTypeChecked(View view, int i) {
Boolean checked = ((CheckBox) view).isChecked();
if (checked) {
type.set(i);
} else {
type.set(0);
}
}
private val observableBoolean = ObservableBoolean(false)
。 - EpicPandaForce