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);
}
我在下面定义了带有单选按钮的单选组。如何正确实施 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);
}