我有一个测验类型的应用程序,在每个问题上我都有一个让用户标记问题的选项。
当我打开对话框时,一切正常,但如果我再次打开对话框会导致索引增量。
例如,如果我按下索引5,结果索引为5,然后如果我再次打开对话框并再次按索引5,结果为10。
Dialog alert = new Dialog(this);
alert.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
alert.setContentView(R.layout.dialog_layout);
RadioGroup mRadioGroup = (RadioGroup) alert.findViewById(R.id.dialog_radioGroup);
final String[] options = {
((RadioButton)mRadioGroup.getChildAt(0)).getText().toString(),
((RadioButton)mRadioGroup.getChildAt(1)).getText().toString(),
((RadioButton)mRadioGroup.getChildAt(2)).getText().toString(),
((RadioButton)mRadioGroup.getChildAt(3)).getText().toString(),
((RadioButton)mRadioGroup.getChildAt(4)).getText().toString(),
};
mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
sendToServer = options[i];
}
});
alert.show();
它第一次有效,但如果我再试一次,我总会得到ArrayIndexOutOfBoundsException
。
答案 0 :(得分:2)
我认为你在RadioGroup.OnCheckedChangeListener中混淆了参数
它假设onCheckedChanged(RadioGroup group, int checkedId)
您将上面代码中的checkedId
混淆为索引i
。
您可以查看checkedId
,如下所示
mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
for (int i = 0; i < group.getChildCount(); i++) {
if (group.getChildAt(i).getId() == checkedId) {
sendToServer = options[i];
break;
}
}
}
});
答案 1 :(得分:0)
我能够解决我的问题它不是很漂亮但它有效,但我仍然不明白为什么索引是在监听器上自动递增
当用户点击发送时,我会运行此检查
if(((RadioButton) mRadioGroup.getChildAt(0)).isChecked()){
index = 0;
}else if(((RadioButton) mRadioGroup.getChildAt(1)).isChecked()){
index = 1;
}else if(((RadioButton) mRadioGroup.getChildAt(2)).isChecked()){
index = 2;
}else if(((RadioButton) mRadioGroup.getChildAt(3)).isChecked()){
index = 3;
}
答案 2 :(得分:0)
您的错误是OnCheckedChange方法传递视图的id,而不是索引。您必须更改代码以使用SparseIntArray而不是数组,并将每个值设置为其id而不是index。否则,您可以使用indexOfChild
功能。