Material Design 进阶(十一)——Chip,ChipGroup,ChipDrawable使用

在这里插入图片描述

流式布局标签发展历程

  • 第一阶段:实现这种界面的时候,基本都是自定义一个控件,然后在Java代码中动态的 添加一个个的TextView,还需要计算布局宽度/高度,进行换行等等处理,比较复杂;
  • 第二阶段:使用RecyclerView,我们实现这种界面就比较方便了,具体实现参考这篇文章RecyclerView实现流式布局;
  • 第三阶段:谷歌为我们提供了ChipChipGroupChipDrawable,有了这三者,我们实现这种界面就更加方便了。
    ChipGroup其实继承于FlowLayout,有了Flow Layout我们可以做更加自由灵活的流式布局效果。Material官方流式布局FlowLayout使用参考:https://blog.51cto.com/u_16175517/7248278

Chip

Chip的style分类和特性

  • style="@style/Widget.MaterialComponents.Chip.Action": 默认样式,是一个普通标签,点击后没有任何特殊效果。
  • style="@style/Widget.MaterialComponents.Chip.Entry": 默认一直末尾展示删除按钮;点击后前面展示选中图标,有选中状态,通常可以作为chipDrawable使用,比如在填选邮件收件人时可以使用;
  • style="@style/Widget.MaterialComponents.Chip.Filter": 初始状态下,不展示前后图标,点击后会展示前面选中的图标,并且具有选中状态,通常应用在ChipGroup中;
  • style="@style/Widget.MaterialComponents.Chip.Choice": 具有选中效果,前后没有图标,点击后有选中颜色变化效果。

Chip的基本属性

类别属性名称具体作用
Shapeapp:chipCornerRadius圆角半径
Sizeapp:chipMinHeight最小高度
Backgroundapp:chipBackgroudColor背景颜色
Borderapp:chipStrokeColor边线颜色
Borderapp:chipStrokeWidth边线宽度
Rippleapp:rippleColor水波纹颜色
Labelandroid:text文本内容
Labelandroi:textAppearance字体样式
Labelandroid:textColor修改文本颜色
Chip Iconapp:chipIconVisible前面图标是否显示
Chip Iconapp:chipIconSizechip中文字前面的图标
Chip Iconapp:chipIconTint文字前面的图标着色
Close Iconapp:closeIconVisiblechip中文字后面关闭按钮是否可见
Close Iconapp:closeIconchip中文字后面的关闭图标
Close Iconapp:closeIconSize文字后面的关闭图标的大小
Close Iconapp:closeIconTInt文字后面的着色
Checkableapp:checkable是否可以被选中
Checked Iconapp:checkedIconVisible选中状态的图标是否可见
Checked Iconapp:checkedIcon选中状态的图标
Motionapp:showMotionSepc动效?
Motionapp:hiheMotoinSpec动效?
Paddingsapp:chipStartPadingchip左边距
Paddingsapp:chipEndPadingchip右边距
Paddingsapp:iconStartPadingchipIcon的左边距
Paddingsapp:iconEndPadingchipIcon的右边距
Paddingsapp:textStartPading文本左边距
Paddingsapp:textEndPading文本右边距
Paddingsapp:CloseIconStartPading关闭按钮的左边距
Paddingsapp:closeIconEndPading关闭按钮的右边距

监听事件

  1. setOnCliclListener:同其他View
  2. setOnCheckedStateChangeListener:
  • 只有 checkable=true 时,才生效
  • 未设置checkable属性时,如果应用了filter/entry/choice的style时该监听才有效,因为这三种style的checkable为true,action的checkable默认为false
  1. setOnCloseIconClickListener:关闭按钮的点击监听
    假设我们让Chip所在的界面 实现了 onClickListener ,那么,为chip 设置点击监听时就可以直接调用 chip.setOnClickListener(this)。但是,如果此时也需要监听 CloseIcon 的点击事件,我们必须单独为 CloseIcon 构造一个匿名监听——因为:CloseIcon 是直接通过画笔画出来的,没有id。在处理点击事件时,Chip的源码中实际是监听了触摸事件,根据触摸的位置判断 CloseIcon是否被点击了。

ChipGroup

Chip 可以被放置在 ChipGroup 中,以实现流式布局。该组件合 RadioGroup 很相似,都是用来管理多个子 View 的,可以控制内部子 View 的布局方式。

  • 默认情况下,里面的 Chip 是横向多行排列的,每行的最后一个 Chip 控件如果放不下的时候就会自动换行,符合流式布局的规则。
  • 如果我们不想让 Chip 换行,那么为 ChipGroup 设置 app:singleLine=true,如果 Chip
    会超过一行,则在外层包裹 HorizontalScrollView
  • 当然,只有当其中包裹的 Chip 是 checkable=true 时,才具有选中效果

ChipGroup 基本属性

属性名称具体作用
app:checkedChip设置初始默认选中的 chip
app:chipSpacing设置 Chip 间的间距
app:chipSpacingHorizontal设置 Chip 之间的水平间距,优先级高于 app:chipSpacing
app:chipSpacingVertical设置 Chip 之间的垂直间距,优先级高于 app:chipSpacing
app:singleLine设置是否开启单行模式
app:singleSelection设置是否开启单选模式,默认是多选
app:selectionRequired设置是否必须保留一项选中,防止所有芯片被取消选择
  • 如果有 app:chipSpacingHorizontal 或者 app:chipSpacingVertical属性,chipSpacing 属性会被覆盖;
  • chipSpacing水平间距不生效,但是chipSpacingHorizontal属性有效,这个没发现具体原因,熟悉的同学请在评论里留言,感激不尽。
  • 如何强制 ChipGroup 像 RadioGroup 一样始终至少有一个选定项目?可以使用方法
    setSelectionRequired(true)
动态添加Chip到ChipGroup中

通过xml添加比较简单就不再阐述。重点关注下动态添加,可以为以后做复杂的布局效果做铺垫;

Chip chip = new Chip(getContext());
chip.setText(tagBean.getTagName());
chip.setTextColor(chipTextColor);//设置文字颜色
chip.setTextSize(TypedValue.COMPLEX_UNIT_PX, chipTextSize);//设置文字大小
chip.setChipBackgroundColorResource(chipBackgroundColor);//设置背景色,支持color state list
chip.setChipCornerRadius(chipCornerRadius);//设置圆角大小
chip.setRippleColorResource(rippleColor);//设置点击波纹颜色
chipGroup.addView(chip);

1、动态添加时如何修改Chip Style,有两种方式:
Chip 没有像其他组件一样具有 4 个参数的构造函数,因为它扩展了不支持 4 参数构造函数的 AppCompatCheckbox。但是你可以使用不同的方式。

  1. 设置ChipDrawable
ChipDrawable chipDrawable = ChipDrawable.createFromAttributes(getContext(), null, 0, R.style.CustomChipStyle);
chipDrawable.setTextSize(chipTextSize);
chipDrawable.setTextColor(chipTextColor);
chipDrawable.setChipBackgroundColor(ColorStateList.valueOf(chipBackgroundColor));
chipDrawable.setChipCornerRadius(chipCornerRadius);
chipDrawable.setRippleColorResource(R.color.ripple_color);
tagView.setChipDrawable(chipDrawable);
  1. 修改创建时传入的context其他自定义View也可以通过这种方式设置Style
Context contextThemeWrapper = new ContextThemeWrapper(getContext(), R.style.CustomChipStyle);
Chip chip = new Chip(contextThemeWrapper);

自定义view时动态设置style参考这篇文章:https://juejin.cn/post/7021821759078793247

2、chip的复用性:chip不能复用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/238226.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tailwindcss真的好用吗?

写在前面 今天写一篇关于tailwindcss 的文章,其实这个css技术已经出现很久了,在一些大型项目很多人也已经在用了,虽然不是说必须要会吧,但是没听说过肯定是不行的,他的操作逻辑应该是和unocss差不多,但是今…

1 快速前端开发

前端开发 1 前端开发1.快速开发网站2.浏览器能识别的标签2.1 编码(head)2.2 title(head)2.3 标题2.4 div和span2.4.5 超链接2.4.6 图片小结2.4.7 列表2.4.8 表格2.4.9 input系列(7个)2.4.10 下拉框2.4.11 多…

01 SpringMVC的快速理解

1.1 如图所示,SpringMVC负责表述层(控制层Controller)实现简化! SpringMVC的作用主要覆盖的是表述层,例如: 请求映射、数据输入、视图界面、请求分发、表单回显、会话控制、过滤拦截、异步交互、文件上传…

python 列表的高级应用

当前版本: Python 3.8.4 简介 列表(list)是Python编程语言中的基本数据类型之一,也是一个非常重要的通用序列。在其它编程语言中,它们通常被称为“数组”。可以存储多个元素,包括数字、字符串、甚至其他列…

机器学习 | 无监督聚类K-means和混合高斯模型

机器学习 | 无监督聚类K-means和混合高斯模型 1. 实验目的 实现一个K-means算法和混合高斯模型,并用EM算法估计模型中的参数。 2. 实验内容 用高斯分布产生 k k k个高斯分布的数据(不同均值和方差)(其中参数自己设定&#xff…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑩

单元测试 一、任务要求 题目1:根据下列流程图编写程序实现相应处理,程序根据两个输入参数iRecordNum和IType计算x的值并返回。编写程序代码,使用JUnit框架编写测试类对编写的程序代码进行测试,测试类中设计最少的测试数据满足基路…

shp文件与数据库(创建shp文件)

前言 前面把shp文件中的内容读取到数据库,接下来就把数据库中的表变成shp文件。 正文 简单的创建一个shp文件 暂时不读取数据库的表,先随机创建一个shp文件。既然是随机的,这就需要使用到faker这个第三方库,代码如下。 impor…

【排序】快速排序(C语言实现)

文章目录 前言1. Hoare思想2. 挖坑法3. 前后指针法4. 三路划分5. 快速排序的一些小优化5.1 三数取中常规的三数取中伪随机的三数取中 5.2 小区间优化 6. 非递归版本的快排7. 快速排序的特性总结 前言 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其…

格密码基础:SIS问题的困难性

目录 一. SIS问题的困难性 二. SIS问题归约的性质 2.1 2004年 [MR04] 2.2 2008年 【GPV08】 2.3 2013年【MP13】 三. 归约证明 3.1 核心理解 3.2 归约步骤 3.3 性质理解 一. SIS问题的困难性 推荐先阅读: 格密码基础:SIS问题的定义与理解-CSD…

【Linux】应用与驱动交互及应用间数据交换

一、应用程序与 Linux 驱动交互主要通过以下几种方式: 1. 系统调用接口(System Calls): 应用程序可以通过系统调用,如 open(), read(), write(), ioctl(), 等来与设备驱动进行交互。这些调用最终会通过内核转发到相应的驱动函数…

感染嗜肺军团菌是什么感觉?

记录一下最近生病的一次经历吧,可能加我好友的朋友注意到了,前几天我发了个圈,有热心的朋友还专门私信了我说明了他自己的情况和治疗经验,感谢他们。 ​ 那么关于这次生病的经历,给大家分享一下。 首先,这次…

解锁 JavaScript 数组的强大功能:常用方法和属性详解(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

70.网游逆向分析与插件开发-角色数据的获取-自动化助手UI显示角色数据

内容参考于:易道云信息技术研究院VIP课 上一个内容:利用技能点属性分析角色数据基址-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:367aa71f60b…

C++ 完成Client分页显示log

分页显示t_log 1、获取用户的输入 1.1、写一个Input成员函数&#xff0c;处理输入进来的语句 std::string XClient::Input() {//清空缓冲//cin.ignore(4096, \n);string input "";for (;;){char a getchar();if (a < 0 || a \n || a \r)break;cout <<…

蓝桥杯准备

书籍获取&#xff1a;Z-Library – 世界上最大的电子图书馆。自由访问知识和文化。 (zlibrary-east.se) 书评&#xff1a;(豆瓣) (douban.com) 一、观千曲而后晓声 别人常说蓝桥杯拿奖很简单&#xff0c;但是拿奖是一回事&#xff0c;拿什么奖又是一回事。况且&#xff0c;如果…

LeetCode讲解篇之78. 子集

文章目录 题目描述题解思路题解代码 题目描述 题解思路 初始化一个start变量记录当前从哪里开始遍历搜索nums 搜索过程的数字组合加入结果集 然后从start下标开始遍历nums&#xff0c;更新start&#xff0c;递归搜索 直到搜索完毕&#xff0c;返回结果集 题解代码 class …

wxWidgets实战:使用mpWindow绘制阻抗曲线

选择模型时&#xff0c;需要查看model的谐振频率&#xff0c;因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示&#xff1a; mpWindow 左侧使用mpWindow&#xff0c;右侧使用什么&#xff1f; wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…

npm run dev,vite 配置 ip 访问

启动项目通过本地 ip 的方式访问 方式一.通过修改 package.json "scripts": {"dev": "vite --host 0.0.0.0",}, 方式二.通过修改 vite.config.ts export default defineConfig({plugins: [vue(), vueJsx()],server: { // 配置 host 与 port 方…

AI大模型学习笔记二

文章目录 一、Prompt Engineering1&#xff09;环境准备 二、LangChain&#xff08;一个框架名字&#xff09;三、Fine-tuning&#xff08;微调&#xff09; 一、Prompt Engineering 1&#xff09;环境准备 ①安装OpenAI库 pip install --upgrade openai附加 安装来源 pyth…

DDNS-GO配置使用教程

环境&#xff1a;openwrt 下载地址&#xff1a;Releases jeessy2/ddns-go GitHub 下载 ssh至openwrt根目录&#xff0c;根据你的处理器选择要下载的版本&#xff0c;我是路由器&#xff0c;选择的是 ddns-go_5.7.1_linux_arm64.tar.gz wget github链接 安装 tar -zxvf…