RadioGroup CheckedChangeListener索引错误

时间:2016-08-20 23:27:34

标签: java android

我有一个测验类型的应用程序,在每个问题上我都有一个让用户标记问题的选项。

当我打开对话框时,一切正常,但如果我再次打开对话框会导致索引增量。

例如,如果我按下索引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

3 个答案:

答案 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功能。