筛选菜单--弹性式RadioGroup(可自动换行)

来源:互联网 发布:阿里云java开发手册 编辑:程序博客网 时间:2024/05/21 11:03

演示效果

实现了自动换行的RadioGroup,而不再局限于只能把RadioButton放在一行或一列,并实现了点击单个RadioButton时,点击选中,再点击取消

看代码

FlexRadioGroup继承自FlexboxLayout,FlexboxLayout是谷歌开源的弹性盒子布局,使用可参考oschina文章

布局文件

<com.itzyf.flexradiogroup.FlexRadioGroup        android:id="@+id/frg_label"        android:layout_width="match_parent"        android:layout_height="wrap_content"        app:flexWrap="wrap" />

使用代码动态添加RadioButton即可

动态添加

        /**         *  64dp菜单的边距{@link DrawerLayout#MIN_DRAWER_MARGIN}+10dp*2为菜单内部的padding=84dp         */        float margin = DensityUtils.dp2px(this, 85);        float width = DensityUtils.getWidth(this);        for (String filter : filters) {            RadioButton rb = (RadioButton) getLayoutInflater().inflate(R.layout.item_label, null);            rb.setText(filter);            FlexboxLayout.LayoutParams lp = new FlexboxLayout.LayoutParams((int) (width - margin) / 3, ViewGroup.LayoutParams.WRAP_CONTENT);            rb.setLayoutParams(lp);            group.addView(rb);            /**             * 下面两个监听器用于点击两次可以清除当前RadioButton的选中             * 点击RadioButton后,{@link FlexRadioGroup#OnCheckedChangeListener}先回调,然后再回调{@link View#OnClickListener}             * 如果当前的RadioButton已经被选中时,不会回调OnCheckedChangeListener方法,故判断没有回调该方法且当前RadioButton确实被选中时清除掉选中             */            group.setOnCheckedChangeListener(new FlexRadioGroup.OnCheckedChangeListener() {                @Override                public void onCheckedChanged(@IdRes int checkedId) {                    mProtectFromCheckedChange = true;                }            });            rb.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (!mProtectFromCheckedChange && ((RadioButton) v).isChecked()) {                        group.clearCheck();                    } else mProtectFromCheckedChange = false;                }            });        }

FlexRadioGroup参考RadioGroup编写,所与很类似只是RadioGroup继承自LinearLayout,导致只能水平或垂直,而无法自动换行,而FlexboxLayout属于弹性布局,继而实现了自动换行的RadioGroup

FlexRadioGroup.PassThroughHierarchyChangeListener

    /**     * 当布局添加或者删除View时的监听器     */    private class PassThroughHierarchyChangeListener implements            ViewGroup.OnHierarchyChangeListener {        private ViewGroup.OnHierarchyChangeListener mOnHierarchyChangeListener;        /**         * 子View添加时,调用此方法         */        public void onChildViewAdded(View parent, View child) {            if (parent == FlexRadioGroup.this && child instanceof RadioButton) { //如果子View没有Id,则生产一个id给view                int id = child.getId();                // generates an id if it's missing                if (id == View.NO_ID) {                    id = ViewIdGenerator.generateViewId();                    child.setId(id);                }                //                /**                 *原RadioGroup中调用的是{@link RadioButton#setOnCheckedChangeWidgetListener}                 * 但由于被隐藏,无法调用,反射也无法找到,故此使用{@link  RadioButton#setOnCheckedChangeListener }                 * 造成的后果就是子view中不能再去使用{@link  RadioButton#setOnCheckedChangeListener }监听器                 */                ((RadioButton) child).setOnCheckedChangeListener(                        mChildOnCheckedChangeListener);            }            if (mOnHierarchyChangeListener != null) {                mOnHierarchyChangeListener.onChildViewAdded(parent, child);            }        }        /**         * {@inheritDoc}         */        public void onChildViewRemoved(View parent, View child) {            if (parent == FlexRadioGroup.this && child instanceof RadioButton) {                ((RadioButton) child).setOnCheckedChangeListener(null);            }            if (mOnHierarchyChangeListener != null) {                mOnHierarchyChangeListener.onChildViewRemoved(parent, child);            }        }    }

代码跟原来的RadioGroup差不多,用setOnCheckedChangeListener替换了被隐藏的监听器setOnCheckedChangeWidgetListener。

源码地址:https://github.com/zouyuanfeng/FlexRadioGroup

添加收缩标签的功能

演示

0 0
原创粉丝点击