探索RadioGroup下可否添加子Layout

本文探讨了在Android中如何在RadioGroup中使用布局实现复选按钮的效果。通过查看源码发现,RadioGroup直接添加ViewGroup会导致功能失效。作者尝试修改源码,增加新方法寻找子级RadioButton,并调整OnHierarchyChangeListener。然而,这种方法限制了一个布局只能包含一个RadioButton。最终,作者选择自定义子View的布局,通过重写onMeasure()和onLayout()方法来解决问题,实现了更灵活的布局效果。
摘要由CSDN通过智能技术生成

创新杯的故事= =


阳光明媚的一天就这样开始了。

想写一个5*2的选择按钮,
用button,实现radiobutton的效果比较麻烦,而用radiobutton,写好之后发现radiogroup如果嵌套layout,就失去了他的功能。于是开始边寻思边折腾。

radiogroup明显是一个继承了viewgroup的layout,相信大家都看过下图,但他为何不能嵌套另一个viewgroup。。真是百思不得其姐。
android view/viewgroup结构

(此处挠头半小时。)

我机智的决定去看android 的源码,
发现android自带的RadioGroup是继承自LinearLayout,如果布局的时候不是直接写radiobutton,即radiobutton外面还包了一层容器,这时分组是不成功的,因为查找不到radiobutton。

觉得问题在于addView方法和自定义的PassThroughHierarchyChangeListener,因为他们都是直接getchild来找radiobutton的。
下面就这两个地方动手脚,先拷贝源码,然后去掉
RadioGroup(Context context, AttributeSet attrs)

新增我们需要的方法用来查找viewGroup控件中的radioButton

    /**
     * @author Mr Seven 
     * watch out ! view group can only have one layer of layout
     * @param group
     * @return
     */
    public ArrayList<RadioButton> findRadioButton(ViewGroup group) {
    //find all child that is radiobutton
        ArrayList<RadioButton> btnList = new ArrayList<RadioButton>();
        int len = group.getChildCount();
        for (int i = 0; i < len; i++) {
            if (group.getChildAt(i) instanceof RadioButton) {
                btnList.add((RadioButton) group.getChildAt(i));
            } else if (group.getChildAt(i) instanceof ViewGroup) {
                ArrayList<RadioButton> subList = findRadioButton((ViewGroup) group
                        .getChildAt(i));
                for (int j = 0; j < subList.size(); j++) {
                    btnList.add(subList.get(j));
                }
            }
        }
        return btnList;
    }

能找到所有radiogroup下的radiobutton,剩下的就好办了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值