Android开发RadioGroup内RadioButton无法实现单选问题求解
问题根因
单选互斥失效的核心问题是RadioGroup初始化位置错误:你在遍历选项的for循环内部每次都新建一个RadioGroup实例,每个RadioGroup中仅包含1个RadioButton。Android原生控件的单选互斥规则是只有归属同一个RadioGroup的RadioButton才会自动实现选中互斥,当前每个选项单独属于一个独立组,自然可以同时选中多个。
修复步骤
- 将
RadioGroup的初始化逻辑移到选项遍历循环的外部,单道单选题仅对应一个RadioGroup实例 - 该题所有选项的
RadioButton全部添加到这同一个RadioGroup中 - 选项遍历完成后,再将装载了全部选项的
RadioGroup添加到外层布局中,不要在循环内重复添加RadioGroup - 替换手动用循环下标
i设置控件id的逻辑,避免同页面多道题目id重复引发选中状态错乱
修正后完整实现代码
private void radioButtonQuestion(String radioquest, JsonArray optionsArray) { RadioButton radio; JsonArray dependenciesArray = (JsonArray) indQuestions.get("dependencies"); ArrayList<String> list = new ArrayList<>(); for(int a=0; a<optionsArray.size();a++) { JsonObject optionsObject = (JsonObject) optionsArray.get(a); JsonObject dependenciesObject = (JsonObject) dependenciesArray.get(a); String option = optionsObject.get("value").getAsString(); list.add(option); } LinearLayout ll=new LinearLayout(context); ll.setOrientation(LinearLayout.VERTICAL); cardview = new CardView(context); layoutparams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layoutparams.setMargins(10,20,10,20); cardview.setLayoutParams(layoutparams); cardview.setRadius(30); cardview.setPadding(10, 10, 10, 10); cardview.setCardBackgroundColor(Color.WHITE); cardview.setMaxCardElevation(20); cardview.setMaxCardElevation(6); textview = new TextView(context); textview.setText(radioquest); textview.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); textview.setTextColor(Color.BLACK); textview.setPadding(15, 25, 25, 15); textview.setGravity(Gravity.NO_GRAVITY); ll.addView(textview); // 单道题初始化唯一的RadioGroup,放在循环外 RadioGroup radioGroup = new RadioGroup(context); radioGroup.setOrientation(LinearLayout.VERTICAL); for(int i = 0; i< list.size();i++) { radio = new RadioButton(context); radio.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); radio.setPadding(15, 15, 15, 15); // 生成全局唯一控件id,避免多题id冲突 radio.setId(View.generateViewId()); radio.setText(list.get(i)); // 所有选项加入同一个RadioGroup radioGroup.addView(radio); } // 把装载完所有选项的RadioGroup加入外层布局 ll.addView(radioGroup); ll.setId(id); cardview.addView(ll); cardview.setId(id); cardview.setTag("Radio "+id); id++; relativeLayout.addView(cardview); }
补充说明
如果需要自定义选项之间的间距、选中样式,直接给RadioGroup设置内部子项的布局参数,或者给每个RadioButton设置对应属性即可,不需要嵌套多层RadioGroup实现布局效果。
内容的提问来源于stack exchange,提问作者Prasanth M
相关产品推荐
相关产品推荐

