在需求中经常会遇到,一个RidiaGroup中会有几个RadioButton,然后可以选择并且切换状态,但是有时这几个tab会很复杂,不是一个RadioButton可以满足的,这时就需要对RadioGroup做一些修改。
现实中遇到的问题,我一个tab可能ViewGroup,然后里面有3个textview,当切换时这3个textview,包括ViewGroup本身会切换一种状态,最Low的写法就是,捕获这个点击事件,然后对这几个元素做修改。理想中的是我自定义一个RadioGroup来做这些事情。然后元素被Selector控制下面看代码。
/**
* Created by future
*/
public class MyRadioGroup extends LinearLayout implements View.OnClickListener{
private OnCheckChangeListener checkChangeListener;
public MyRadioGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
for(int i = 0; i < getChildCount(); i++) {
View view = getChildAt(i);
view.setOnClickListener(this);
}
}
//获取被选中的view的Id
public int getCheckedId() {
for(int i = 0; i < getChildCount(); i++) {
View view = getChildAt(i);
if(!view.isEnabled()) {
return view.getId();
}
}
return 0;
}
//获取被选中的view的下标
public int getCheckedIndex() {
for(int i = 0; i < getChildCount(); i++) {
View view = getChildAt(i);
if(!view.isEnabled()) {
return i;
}
}
return 0;
}
//获取被选中的view的tag,前提是setTag,不然会返回Null
public String getCheckedTag() {
for(int i = 0; i < getChildCount(); i++) {
View view = getChildAt(i);
if(!view.isEnabled()) {
return (String)view.getTag();
}
}
return null;
}
//可以初始化,默认哪个被选中
public void setCheckedByIndex(Integer index) {
if(index == null) {
return;
}
if(index >= 0 && index < getChildCount()) {
setChecked(getChildAt(index));
}
}
//可以初始化,默认哪个被选中
public void setChecked(int id) {
setChecked(findViewById(id));
}
//目前只向下寻找了一层,自己可以多寻找几层。这里可以考虑使用递归
@CallSuper
public void setChecked(View child) {
for(int i = 0; i < getChildCount(); i++) {
View view = getChildAt(i);
view.setEnabled(true);
if(view instanceof ViewGroup) {
int count = ((ViewGroup)view).getChildCount();
for(int j = 0; j < count; j++) {
((ViewGroup)view).getChildAt(j).setEnabled(true);
}
}
}
child.setEnabled(false);
if(child instanceof ViewGroup) {
int count = ((ViewGroup) child).getChildCount();
for (int j = 0; j < count; j++) {
((ViewGroup) child).getChildAt(j).setEnabled(false);
}
}
if(checkChangeListener != null) {
checkChangeListener.onCheckChange(child.getId());
}
}
@Override
public void onClick(View v) {
setChecked(v);
}
public void setCheckChangeListener(OnCheckChangeListener checkChangeListener) {
this.checkChangeListener = checkChangeListener;
}
public interface OnCheckChangeListener{
void onCheckChange(int id);
}
}
然后再Xml中使用即可。用法基本上和RadioGroup相同,只是功能更强大。
注意,元素的Selector状态要被enable控制,因为我代码只控制了enable的,这个代码只供参考,主要是思路的共享。