直接回答
正如 @MikeM 在 cmets 中回答的那样,您可以使用 instanceof 检查一次 CompoundButton 或 Checkable 并转换为。
@Override
public void onClick(View view) {
boolean checkState = false;
if (view instanceof Checkable) {
checkState = ((Checkable) view).isChecked();
}
switch (view.getId()) {
// ...
}
}
更好的答案
但是,正如@MikeM 也提到的,您应该使用OnCheckedChangeListener 而不是OnClickListener。有两个类似的已检查更改的侦听器:
CompoundButton 侦听器可用于CheckBox 或RadioButton。但是,如果RadioGroup 中的所有单选按钮都设置了此设置,则侦听器将被调用两次,一次用于关闭按钮,一次用于打开按钮。因此,单选按钮最好使用RadioGroup 监听器。
因此将RadioGroup.OnCheckedChangeListener 添加到RadioGroup 并将CompoundButton.OnCheckedChangeListener 添加到每个CheckBox。
// set RadioGroup.OnCheckedChangeListener
RadioGroup rg = (RadioGroup) view.findViewById(R.id.radio_group);
rg.setOnCheckedChangeListener(radioGroupListener);
// set `CompoundButton.OnCheckedChangeListener`
CheckBox cb1 = (CheckBox) view.findViewById(R.id.check_box_1);
cb1.setOnCheckedChangeListener(checkBoxListener);
CheckBox cb2 = (CheckBox) view.findViewById(R.id.check_box_2);
cb2.setOnCheckedChangeListener(checkBoxListener);
// ...
监听器的实现方式如下:
单选按钮
对于RadioGroup 侦听器返回的任何RadioButton id,isChecked() 的值都是true。
RadioGroup.OnCheckedChangeListener radioGroupListener = new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
// checkedId is the id of the newly checked radio button
switch (checkedId) {
case R.id.radio_button_1:
// ...
break;
case R.id..radio_button_2:
// ...
break;
// ...
}
}
};
复选框
isChecked 值直接传递给CompoundButton 监听器。
CompoundButton.OnCheckedChangeListener checkBoxListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
switch (compoundButton.getId()) {
case R.id.checkbox_1:
// ...
break;
case R.id.checkbox_2:
// ...
break;
}
}
};