美文网首页首页投稿(暂停使用,暂停投稿)
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