一、简介
在开发某APP时,遇到这么一个问题:要使用RadioGroup来实现单选框效果,但是item太多,要分成两行来显示。
![](https://i-blog.csdnimg.cn/blog_migrate/110c6792fbf40ecb656453c6479f9886.png)
一开始我心想,这不是很简单吗,在xml布局里设置RadioGroup的orientation值为vertical,里面嵌套一个水平布局的LinearLayout,然后把RadioButton给它一个一个摆上去不就完事儿咯~so easy的事情,万万没想到。。。。。。
![](https://i-blog.csdnimg.cn/blog_migrate/7ec7ab249e51216efa656decf8128f43.gif)
什么鬼??? 为什么没有单选效果了???
这个问题让我百思不得其解,直到我看到了RadioGroup的源码
二、源码分析
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
// 下面这行就是关键中的关键了
if (child instanceof RadioButton) {
final RadioButton button = (RadioButton) child;
if (button.isChecked()) {
mProtectFromCheckedChange = true;
if (mCheckedId != -1) {
setCheckedStateForView(mCheckedId, false);
}
mProtectFromCheckedChange = false;
setCheckedId(button.getId());
}
}
super.addView(child, index, params);
}
让我们看看关键的判断:if (child instanceof RadioButton)
难怪没有了单选效果,因为我们在RadioGroup里面还嵌套了一层LinearLayout,无法进到判断中的代码块。
既然我们已经知道了为什么多行RadioGroup会没有单选效果,那么解决的方法也就呼之欲出了
三、实现RadioGroup
方法一: RadioGroup其实也是继承了LinearLayout来实现的,那么我们定义两个水平布局的RadioGroup,分别摆放其中的RadioGroup,然后设置相应的点击事件不就可以了吗?
xml布局
<RadioGroup
android:id="@+id/rg_one"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rb_problem_speed_up_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_radiobutton"
android:button="@null"
android:paddingStart="@dimen/dp_14"
android:paddingTop="@dimen/dp_6"
android:paddingEnd="@dimen/dp_14"
android:paddingBottom="@dimen/dp_6"
android:text="@string/speed_up_error"
android:textColor="@drawable/selector_radiobutton_text"
android:textSize="@dimen/sp_15" />
<RadioButton
android:id="@+id/rb_problem_error_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:background="@drawable/selector_radiobutton"
android:button="@null"
android:paddingStart="@dimen/dp_14"
android:paddingTop="@dimen/dp_6"
android:paddingEnd="@dimen/dp_14"
android:paddingBottom="@dimen/dp_6"
android:text="@string/error_code"
android:textColor="@drawable/selector_radiobutton_text"
android:textSize="@dimen/sp_15" />
<RadioButton
android:id="@+id/rb_problem_charge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:background="@drawable/selector_radiobutton"
android:button="@null"
android:paddingStart="@dimen/dp_14"
android:paddingTop="@dimen/dp_6"
android:paddingEnd="@dimen/dp_14"
android:paddingBottom