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

演示效果

height="428" width="240" src="http://itzyf.qiniudn.com/20161025102538259.mp4">

实现了自动换行的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

添加收缩标签的功能

你可能感兴趣的:(Android开发)