Android RadioGroup 点击监听器

Android RadioGroup click listener

我在下面定义了带有单选按钮的单选组。如何正确实施 onClickListener ?我得到 ArrayIndexOutOfBoundsException。不知道怎么回事

 public void createRadioButton(Integer amount, LinearLayout layout, Integer text) {

    AppCompatTextView txt = new AppCompatTextView(activity);
    AppCompatButton btn = new AppCompatButton(activity);
    btn.setText("Click");
    txt.setText(text);
    final AppCompatRadioButton[] rb = new AppCompatRadioButton[amount];
    final RadioGroup rg = new RadioGroup(activity);

    rg.setOrientation(RadioGroup.VERTICAL);

    for( i=0; i<amount; i++){
        rb[i]  = new AppCompatRadioButton(activity);
        rg.addView(rb[i]);
        rb[i].setId(i + 100);
        rb[i].setText("Test " + i);
    }
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            int selectedId = rg.getCheckedRadioButtonId();
            rb[i] = (AppCompatRadioButton) activity.findViewById(selectedId);

           Toast.makeText(activity, "VALUE" rb[i].getText(), Toast.LENGTH_SHORT).show();
        }
    });
    layout.addView(txt);
    layout.addView(rg);
    layout.addView(btn);
}
 for( i=0; i<amount; i++){
        rb[i]  = new AppCompatRadioButton(activity);
        rg.addView(rb[i]);
        rb[i].setId(i + 100);
        rb[i].setText("Test " + i);

    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            int selectedId = rg.getCheckedRadioButtonId();
            rb[i] = (AppCompatRadioButton) activity.findViewById(selectedId);

           Toast.makeText(activity, "VALUE" rb[i].getText(), Toast.LENGTH_SHORT).show();
        }
    });
}

如果你想为你循环的每个项目添加一个 onclicklistener,你需要扩展你的 for 循环,这样它也会迭代你的 onclicklistener,就像这样。

循环后你的 i 值将等于 amount 并且你在这里使用相同的 i rb[i] = (AppCompatRadioButton) activity.findViewById(selectedId); 并且您的列表大小等于 amount-1 这就是您获得 ArrayIndexOutOfBoundsException

的原因

对单选组使用 setOnCheckedChangeListener

这样使用

radiogroup_gender.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    switch (checkedId){
                        case R.id.radiobutton_male :
                             break;
                        case R.id.radiobutton_female :

                            break;
                        default:
                             break;
                    }
                }
            });

您的代码中有一些错误。首先,您的参数文本应该是 "String",而不是整数。但是,代码中的主要问题是您用代码覆盖了最后一个单选按钮( rb[i] )。你不应该这样做。 最好的方法是在循环中声明变量 i 并在用户单击它时创建一个新的 RadioButton。

Ps :您验证的解决方案效率低下,因为它会在您每次创建按钮时创建一个点击侦听器。或者它总是更新同一个监听器,因为你只有一个按钮。

试试下面的代码 ;)

public void createRadioButton(Integer amount, LinearLayout layout, String text) {

    AppCompatTextView txt = new AppCompatTextView(activity);
    AppCompatButton btn = new AppCompatButton(activity);
    btn.setText("Click");
    txt.setText(text);
    final AppCompatRadioButton[] rb = new AppCompatRadioButton[amount];
    final RadioGroup rg = new RadioGroup(activity);

    rg.setOrientation(RadioGroup.VERTICAL);

    for(int i=0; i<amount; i++){
        rb[i]  = new AppCompatRadioButton(activity);
        rg.addView(rb[i]);
        rb[i].setId(i + 100);
        rb[i].setText("Test " + i);
    }
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int selectedId = rg.getCheckedRadioButtonId();
            AppCompatRadioButton button= (AppCompatRadioButton) activity.findViewById(selectedId);

            Toast.makeText(activity, "VALUE" +  button.getText(), Toast.LENGTH_SHORT).show();
        }
    });
    layout.addView(txt);
    layout.addView(rg);
    layout.addView(btn);
}