创新杯的故事= =
阳光明媚的一天就这样开始了。
想写一个5*2的选择按钮,
用button,实现radiobutton的效果比较麻烦,而用radiobutton,写好之后发现radiogroup如果嵌套layout,就失去了他的功能。于是开始边寻思边折腾。
radiogroup明显是一个继承了viewgroup的layout,相信大家都看过下图,但他为何不能嵌套另一个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,剩下的就好办了。