我已在多个CheckBox
和RadioButton
视图中设置了click事件侦听器。这两种视图类型都有isChecked()
方法。我可以通过为每个开关盒铸造它的类型来获得任何一个的状态,但是在进入开关盒之前我能否在一般意义上得到它们中的任何一个状态?
@Override
public void onClick(View view) {
boolean checkState;
switch (view.getId()) {
case R.id.radio_button_1:
checkState = ((RadioButton) view).isChecked();
// ...
break;
case R.id.check_box_1:
checkState = ((CheckBox) view).isChecked();
// ...
break;
// more check boxes and ratio buttons ...
}
}
这个问题与this one有类似的标题,但是有太多的代码让我很容易理解他们是否在问同样的事情。
在我写这个问题的过程中,我找到了一个答案,我将在下面发帖。但是,如果有更好的答案,我会接受它。
答案 0 :(得分:1)
考虑一个RadioButton和一个CheckBox
RadioButton button = (RadioButton) findViewById(R.id.radio_button);
button.setOnCheckedChangeListener(listener);
CheckBox box = (CheckBox) findViewById(R.id.checkbox);
box.setOnCheckedChangeListener(listener);
两者都有一个监听器
CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView instanceof CheckBox ){
Toast.makeText(getApplicationContext(), "ChechBox " + String.valueOf(isChecked), Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getApplicationContext(), "RadionButton " + String.valueOf(isChecked), Toast.LENGTH_SHORT).show();
}
}
};
如果还有很多,我们可以使用单个监听器,如下所示
CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView instanceof CheckBox ){
final ChechBox b = (ChechBox)buttonView;
switch(b.getId()){
case R.id.first_checkbox:
. . . . . . . .
}
}else {
final RadioButton r = (RadioButton)buttonView;
switch(r.getId()){
case R.id.first_radio
. . . . . . . . . . .
}
}
}
};
您需要将所有视图附加到此侦听器
答案 1 :(得分:0)
正如@MikeM在评论中回答的那样,您可以使用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);
// ...
监听器的实现方式如下:
广播按钮
对于isChecked()
侦听器返回的true
ID,RadioButton
值为RadioGroup
。
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;
}
}
};