筛选菜单--弹性式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
- 筛选菜单--弹性式RadioGroup(可自动换行)
- 可自动换行的RadioGroup
- 可自动换行的RadioGroup
- 自动换行的RadioGroup
- 可以自动换行的radioGroup
- Android开发之自动换行RadioGroup
- RadioGroup 自动换行且保留点击事件
- 可自动换行的radiobutton
- 可以自动换行的RadioGroup (默认水平布局)
- 自动筛选实现三级联动下拉菜单
- 可自动换行的单选 RadioGroupEx
- RadioGroup 的分列换行
- 可以换行的RadioGroup
- 筛选菜单
- 筛选菜单
- excel 常用使用技巧 二(数据筛选、条件格式、自动换行、自定义序列、自定义单位、冻结窗格)
- RadioGroup作为菜单收集
- RadioGroup中的RadioButton实现换行
- Jaden的推特
- Android Studio获取SHA1(获取SHA1的通用方法)
- 搜索算法-广度优先和深度优先搜索
- SDP解析
- Xcode的视图调试器
- 筛选菜单--弹性式RadioGroup(可自动换行)
- JavaScript简介
- Percona-Server数据库的安装方法
- 12c的FETCH FIRST ROWS特性可以简化老版本中ROW_NUM()或ROWNUM的分页排序写法
- 《计算机网络》知识总结-1.互联网是怎么通过网线连接起来的?电路交换,报文交换,分组交换这三个尤物究竟是何方神圣?
- JavaScript基础练习发送信息
- SIP的应答
- TCP/IP协议栈之二---------运输层
- 使用angularjs1.x构建前台开发框架(四)——模拟后台响应(打桩模块)