美文网首页首页投稿(暂停使用,暂停投稿)
Android 自定义组件-加强版RadioGroup

Android 自定义组件-加强版RadioGroup

作者: 菠萝鱼_lc | 来源:发表于2017-07-04 15:30 被阅读0次

在需求中经常会遇到,一个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的,这个代码只供参考,主要是思路的共享。

相关文章

网友评论

    本文标题:Android 自定义组件-加强版RadioGroup

    本文链接:https://www.haomeiwen.com/subject/swcxhxtx.html