自定义可自动换行的RadioButton组件

Posted 左郁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义可自动换行的RadioButton组件相关的知识,希望对你有一定的参考价值。

✏️ 丨 自定义可自动换行的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组件的主要内容,如果未能解决你的问题,请参考以下文章

自定义可自动换行的RadioButton组件

自定义可自动换行的RadioButton组件

Android自定义View(LineBreakLayout-自动换行的标签容器)

我生成了一个换行的自定义Label控件,如何取得该行数啊??

flex 自定义组件

自定义组件中的 RadioButton 功能