自定义可自动换行的RadioButton组件
Posted 左郁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义可自动换行的RadioButton组件相关的知识,希望对你有一定的参考价值。
1. 需求如下:
前阵子做了一个点名管理的需求,点名状态由后端配置的,不同大队的点名机制可能不同,比如一中队状态:“在勤、迟到、缺勤、请假”,二中队状态:“在勤、迟到、缺勤、请假、外勤、备勤”等
要求红框里的内容动态变化,可以实现自动换行
2.实现效果展示
3.实现代码
自定义组件代码如下:
package com.zh.housekeeping.common.widget
import android.content.Context
import android.util.AttributeSet
import android.widget.RadioGroup
import com.zh.housekeeping.R
/**
* Desc
* Author ZY
* Date 2021/11/6 18:22
*/
class FlowRadioGroup : RadioGroup
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)
//获取最大宽度
val maxWidth = MeasureSpec.getSize(widthMeasureSpec)
//获取Group中的Child数量
val childCount = childCount
//设置Group的左边距,下面也会使用x计算每行所占的宽度
var x = 0
//设置Group的上边距,下面也会使用y计算Group所占的高度
var y = 30
//设置Group的行数
var row = 0
for (index in 0 until childCount)
val child = getChildAt(index)
if (child.visibility != GONE)
child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)
//重新计算child的宽高
var width = child.measuredWidth
val height = child.measuredHeight
//添加到X中,(width+10) 设置child左边距
x += width + resources.getDimension(R.dimen.dp_12).toInt()
//行数*child高度+这次child高度=现在Group的高度,(height + 10)设置child上边距
y = row * (height + 20) + (height + 20)
//当前行宽X大于Group的最大宽度时,进行换行
if (x > maxWidth)
//当index不为0时,进行row++,防止FirstChild出现大于maxWidth时,提前进行row++
if (index != 0) row++
//child的width大于maxWidth时,重新设置child的width为最大宽度
if (width >= maxWidth)
width = maxWidth - 30
//重新设置当前X
x = width + 20
//重新设置现在Group的高度
y = row * (height + 20) + (height + 20)
// 设置容器所需的宽度和高度
setMeasuredDimension(maxWidth, y)
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int)
val childCount = childCount
val maxWidth = r - l
var x = 10
var y = 0
var row = 0
for (i in 0 until childCount)
val child = getChildAt(i)
if (child.visibility != GONE)
var width = child.measuredWidth
val height = child.measuredHeight
x += width + resources.getDimension(R.dimen.dp_12).toInt()
y = row * (height + 20) + (height + 20)
if (x > maxWidth)
if (i != 0) row++
if (width >= maxWidth)
width = maxWidth - 30
x = width + 10 + resources.getDimension(R.dimen.dp_12).toInt()
y = row * (height + 20) + (height + 20)
child.layout(x - width, y - height, x, y)
以上是关于自定义可自动换行的RadioButton组件的主要内容,如果未能解决你的问题,请参考以下文章
Android自定义View(LineBreakLayout-自动换行的标签容器)