Android随笔3:多行RadioGroup

一、简介在开发某APP时,遇到这么一个问题:要使用RadioGroup来实现单选框效果,但是item太多,要分成两行来显示。一开始我心想,这不是很简单吗,在xml布局里设置RadioGroup的orientation值为vertical,然后把RadioButton给它一个一个摆上去不就完事儿咯~so easy的事情,万万没想到。。。。。。...
摘要由CSDN通过智能技术生成

一、简介


在开发某APP时,遇到这么一个问题:要使用RadioGroup来实现单选框效果,但是item太多,要分成两行来显示。
一开始我心想,这不是很简单吗,在xml布局里设置RadioGroup的orientation值为vertical,里面嵌套一个水平布局的LinearLayout,然后把RadioButton给它一个一个摆上去不就完事儿咯~so easy的事情,万万没想到。。。。。。

什么鬼??? 为什么没有单选效果了???
这个问题让我百思不得其解,直到我看到了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
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值