自定义底部筛选弹框

自定义底部筛选弹框

推荐红绿蓝三种样式,可以根据需求定义主题颜色, 对某一分类进行单选设置、多选设置,返回结果为id集合,单选时取下标了0

anim

slide_in_bottom.xml

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromYDelta="100%p"
    android:toYDelta="0" />

slide_out_bottom.xml

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromYDelta="100%p"
    android:toYDelta="0" />

style

ini 复制代码
<style name="Theme.MultiChipGroupDemo" parent="Base.Theme.MultiChipGroupDemo" />
<style name="BottomSheetDialogStyle" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowAnimationStyle">@style/BottomSheetAnimation</item>
</style>

<style name="BottomSheetAnimation" parent="Animation.AppCompat.Dialog">
    <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
    <item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
</style>

layout

item_chip_group.xml

ini 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginBottom="20dp">

    <!-- 组标题 -->
    <TextView
        android:id="@+id/group_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:textStyle="bold"
        android:layout_marginBottom="8dp"/>

    <!-- ChipGroup 容器 -->
    <com.google.android.material.chip.ChipGroup
        android:id="@+id/chip_group"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:singleSelection="true"
        app:chipSpacingHorizontal="8dp"
        app:chipSpacingVertical="8dp"/>

</LinearLayout>

bottom_sheet_multi_chip_group.xml

ini 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingBottom="16dp">

    <!-- 标题栏 -->
    <FrameLayout
        android:id="@+id/title_bar"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:gravity="center_vertical"
        android:paddingHorizontal="16dp">

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="筛选条件"
            android:textSize="18sp"
            android:textStyle="bold" />
        <!--        @android:drawable/ic_menu_close_clear_cancel-->
        <ImageButton
            android:id="@+id/iv_close"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_gravity="end|center_vertical"
            android:background="#00FFFFFF"
            android:contentDescription="关闭"
            app:srcCompat="@drawable/baseline_close_24"
            app:tint="#666666" />
    </FrameLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#EEEEEE" />

    <!-- 内容区域 (多个ChipGroup) -->
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:maxHeight="400dp">

        <LinearLayout
            android:id="@+id/container_chip_groups"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="16dp" />
    </ScrollView>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#EEEEEE" />

    <!-- 按钮区域 -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:orientation="horizontal">

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/btn_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_weight="1"
            android:background="#E9FFFB"
            android:gravity="center"
            android:paddingVertical="12dp"
            android:text="重置"
            android:textColor="#00B594"
            android:textSize="16dp" />

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/btn_confirm"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_weight="1"
            android:background="#00B594"
            android:gravity="center"
            android:paddingVertical="12dp"
            android:text="确定"
            android:textColor="#ffffff"
            android:textSize="16dp" />
    </LinearLayout>
</LinearLayout>

ShapeUtils支持设置背景色、渐变色和描边效果和圆角

kotlin 复制代码
package cn.nio.multichipgroupdemo


import android.content.Context
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import com.google.android.material.shape.CornerFamily
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.shape.ShapeAppearanceModel
/**
 * @desc 使其支持设置背景色、渐变色和描边效果和圆角
 * @Author Developer
 * @Date 2025/8/20-17:01
 */
object ShapeUtils {

    /**
     * 创建带圆角、背景色和描边的MaterialShapeDrawable
     */
    fun createRoundedDrawable(
        context: Context,
        radius: Float,
        backgroundColor: Int,
        strokeWidth: Float = 0f,
        strokeColor: Int = Color.TRANSPARENT,
    ): MaterialShapeDrawable {
        val shapeAppearanceModel = ShapeAppearanceModel.builder()
            .setAllCorners(CornerFamily.ROUNDED, radius.dpToPx(context))
            .build()

        return MaterialShapeDrawable(shapeAppearanceModel).apply {
            setTint(backgroundColor)
            setStroke(strokeWidth.dpToPx(context), strokeColor)
        }
    }

    /**
     * 创建带自定义圆角、背景色和描边的MaterialShapeDrawable
     */
    fun createCustomRoundedDrawable(
        context: Context,
        topLeft: Float = 0f,
        topRight: Float = 0f,
        bottomRight: Float = 0f,
        bottomLeft: Float = 0f,
        backgroundColor: Int,
        strokeWidth: Float = 0f,
        strokeColor: Int = Color.TRANSPARENT,
    ): MaterialShapeDrawable {
        val shapeAppearanceModel = ShapeAppearanceModel.builder()
            .setTopLeftCorner(CornerFamily.ROUNDED, topLeft.dpToPx(context))
            .setTopRightCorner(CornerFamily.ROUNDED, topRight.dpToPx(context))
            .setBottomRightCorner(CornerFamily.ROUNDED, bottomRight.dpToPx(context))
            .setBottomLeftCorner(CornerFamily.ROUNDED, bottomLeft.dpToPx(context))
            .build()

        return MaterialShapeDrawable(shapeAppearanceModel).apply {
            setTint(backgroundColor)
            setStroke(strokeWidth.dpToPx(context), strokeColor)
        }
    }

    /**
     * 创建带圆角、渐变色和描边的GradientDrawable
     */
    fun createGradientRoundedDrawable(
        context: Context,
        radius: Float,
        colors: IntArray,
        orientation: GradientDrawable.Orientation = GradientDrawable.Orientation.TOP_BOTTOM,
        strokeWidth: Float = 0f,
        strokeColor: Int = Color.TRANSPARENT,
    ): GradientDrawable {
        return GradientDrawable(orientation, colors).apply {
            cornerRadius = radius.dpToPx(context)
            if (strokeWidth > 0) {
                setStroke(strokeWidth.dpToPx(context).toInt(), strokeColor)
            }
        }
    }

    /**
     * 创建带自定义圆角、渐变色和描边的GradientDrawable
     */
    fun createCustomGradientRoundedDrawable(
        context: Context,
        topLeft: Float = 0f,
        topRight: Float = 0f,
        bottomRight: Float = 0f,
        bottomLeft: Float = 0f,
        colors: IntArray,
        orientation: GradientDrawable.Orientation = GradientDrawable.Orientation.TOP_BOTTOM,
        strokeWidth: Float = 0f,
        strokeColor: Int = Color.TRANSPARENT,
    ): GradientDrawable {
        return GradientDrawable(orientation, colors).apply {
            val radii = floatArrayOf(
                topLeft.dpToPx(context), topLeft.dpToPx(context),
                topRight.dpToPx(context), topRight.dpToPx(context),
                bottomRight.dpToPx(context), bottomRight.dpToPx(context),
                bottomLeft.dpToPx(context), bottomLeft.dpToPx(context)
            )
            cornerRadii = radii
            if (strokeWidth > 0) {
                setStroke(strokeWidth.dpToPx(context).toInt(), strokeColor)
            }
        }
    }

    /**
     * dp转px的扩展函数
     */
    private fun Float.dpToPx(context: Context): Float {
        return this * context.resources.displayMetrics.density
    }
}

DialogThemeManage支持设置推荐主题样式

kotlin 复制代码
/**
 * @desc 选择推荐BottomSheet主题样式
 * @Author Developer
 * @Date 2025/7/11-17:07
 */
enum class DialogThemeManage(
    val color: String,
    val lightBackgroundColor: String,
    val startColor: String,
    val endColor: String,
) {
    GREEN("#00B594", "#E9FFFB", "#00B594", "#02D17E"),
    BLUE("#5570FF", "#ebebff", "#4D65FF", "#6F91FF"),
    RED("#FF5C5C", "#FFEBEB", "#FF5C5C", "#FF8A8A"),
}

MultiChipGroupBottomSheet主功能弹框

kotlin 复制代码
package cn.nio.multichipgroupdemo


import android.app.Dialog
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.util.TypedValue
import android.view.Gravity
import android.view.WindowManager
import android.widget.ImageButton
import android.widget.LinearLayout
import android.widget.TextView
import androidx.annotation.StyleRes
import androidx.appcompat.widget.AppCompatTextView

import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
import com.google.android.material.shape.ShapeAppearanceModel

/**
 * @desc 支持单选和多选的多项选择BottomSheet
 * @Author Developer
 * @Date 2025/7/21-15:39
 */
class MultiChipGroupBottomSheet private constructor(
    context: Context,
    private val selectedTheme: DialogThemeManage,
    private val title: String,
    private val chipGroups: List<ChipGroupData>,
    private val confirmButtonText: String,
    private val cancelButtonText: String,
    private val onConfirmListener: OnConfirmListener,
    @StyleRes themeResId: Int,
) : Dialog(context, themeResId) {

    // 数据模型
    data class ChipItem(
        val id: String,
        val text: String,
        val isSelected: Boolean = false,
    )

    class ChipGroupData(
        val groupId: String,
        val title: String,
        val items: List<ChipItem>,
        var isMultiSelect: Boolean = false, // 新增:是否支持多选
    ) {
        // 样式属性
        var titleTextAppearance: Int = android.R.style.TextAppearance_Material_Medium
        var chipCornerRadius: Float = 16f // dp
        var chipStrokeWidth: Int = 1 // dp

        // 颜色属性
        var selectedBackgroundColor: Int = Color.parseColor("#FF5C5C")
        var unselectedBackgroundColor: Int = Color.parseColor("#FFFFFF")
        var selectedTextColor: Int = Color.parseColor("#FFFFFF")
        var unselectedTextColor: Int = Color.parseColor("#333333")
        var selectedStrokeColor: Int = Color.parseColor("#FF5C5C")
        var unselectedStrokeColor: Int = Color.parseColor("#CCCCCC")

        // 链式配置方法
        fun setTitleTextAppearance(resId: Int): ChipGroupData {
            this.titleTextAppearance = resId
            return this
        }

        fun setChipCornerRadius(radius: Float): ChipGroupData {
            this.chipCornerRadius = radius
            return this
        }

        fun setChipStrokeWidth(width: Int): ChipGroupData {
            this.chipStrokeWidth = width
            return this
        }

        // 新增:设置是否支持多选
        fun setMultiSelect(multiSelect: Boolean): ChipGroupData {
            this.isMultiSelect = multiSelect
            return this
        }

        // 颜色配置 - 资源ID
        fun setSelectedBackgroundColor(colorResId: Int): ChipGroupData {
            this.selectedBackgroundColor = context.getColor(colorResId)
            return this
        }

        fun setUnselectedBackgroundColor(colorResId: Int): ChipGroupData {
            this.unselectedBackgroundColor = context.getColor(colorResId)
            return this
        }

        fun setSelectedTextColor(colorResId: Int): ChipGroupData {
            this.selectedTextColor = context.getColor(colorResId)
            return this
        }

        fun setUnselectedTextColor(colorResId: Int): ChipGroupData {
            this.unselectedTextColor = context.getColor(colorResId)
            return this
        }

        fun setSelectedStrokeColor(colorResId: Int): ChipGroupData {
            this.selectedStrokeColor = context.getColor(colorResId)
            return this
        }

        fun setUnselectedStrokeColor(colorResId: Int): ChipGroupData {
            this.unselectedStrokeColor = context.getColor(colorResId)
            return this
        }

        // 颜色配置 - 字符串格式
        fun setSelectedBackgroundColor(colorString: String): ChipGroupData {
            this.selectedBackgroundColor = parseColor(colorString)
            return this
        }

        fun setUnselectedBackgroundColor(colorString: String): ChipGroupData {
            this.unselectedBackgroundColor = parseColor(colorString)
            return this
        }

        fun setSelectedTextColor(colorString: String): ChipGroupData {
            this.selectedTextColor = parseColor(colorString)
            return this
        }

        fun setUnselectedTextColor(colorString: String): ChipGroupData {
            this.unselectedTextColor = parseColor(colorString)
            return this
        }

        fun setSelectedStrokeColor(colorString: String): ChipGroupData {
            this.selectedStrokeColor = parseColor(colorString)
            return this
        }

        fun setUnselectedStrokeColor(colorString: String): ChipGroupData {
            this.unselectedStrokeColor = parseColor(colorString)
            return this
        }

        private fun parseColor(colorString: String): Int {
            return try {
                Color.parseColor(colorString)
            } catch (e: IllegalArgumentException) {
                throw IllegalArgumentException("Invalid color string: $colorString", e)
            }
        }

        companion object {
            private lateinit var context: Context

            // 初始化上下文,在使用前调用
            fun init(context: Context) {
                Companion.context = context
            }
        }
    }

    // 回调接口 - 修改为返回Map<String, List<String>>以支持多选结果
    interface OnConfirmListener {
        fun onConfirm(selectedItems: Map<String, List<String>>)
    }

    // 选中状态存储 - 修改为Map<String, List<String>>以支持多选
    private val selectedItems = mutableMapOf<String, MutableList<String>>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.bottom_sheet_multi_chip_group)
        initWindow()
        initViews()
        initSelectedStates()
    }

    private fun initWindow() {
        window?.apply {
            setGravity(Gravity.BOTTOM)
            attributes = attributes.apply {
                width = WindowManager.LayoutParams.MATCH_PARENT
                setBackgroundDrawable(
                    ShapeUtils.createCustomRoundedDrawable(
                        context,
                        8f.dpToPx(),
                        8f.dpToPx(),
                        0f,
                        0f,
                        Color.WHITE
                    )
                )
            }
        }
    }

    private fun initViews() {
        // 标题设置
        findViewById<TextView>(R.id.title).text = title

        // 关闭按钮
        findViewById<ImageButton>(R.id.iv_close).setOnClickListener { dismiss() }

        // 确认和取消按钮
        val btnConfirm = findViewById<AppCompatTextView>(R.id.btn_confirm).apply {
            text = confirmButtonText
            setOnClickListener {
                onConfirmListener.onConfirm(selectedItems.mapValues { it.value.toList() })
                dismiss()
            }
        }

        ShapeUtils.createGradientRoundedDrawable(
            context,
            8f.dpToPx(),
            intArrayOf(
                Color.parseColor(selectedTheme.startColor),
                Color.parseColor(selectedTheme.endColor)
            ), orientation = GradientDrawable.Orientation.LEFT_RIGHT
        ).let {
            btnConfirm.background = it
        }
        val btnCancel = findViewById<AppCompatTextView>(R.id.btn_cancel).apply {
            text = cancelButtonText
            setOnClickListener { resetToInitialState() }
        }
        btnCancel.setTextColor(Color.parseColor(selectedTheme.color))
        ShapeUtils.createCustomRoundedDrawable(
            context,
            8f.dpToPx(),
            8f.dpToPx(),
            8f.dpToPx(),
            8f.dpToPx(),
            Color.parseColor(selectedTheme.lightBackgroundColor),
            0.5f.dpToPx(),
            Color.parseColor(selectedTheme.color)
        ).let {
            btnCancel.background = it
        }

        // 加载Chip组
        val container = findViewById<LinearLayout>(R.id.container_chip_groups)
        chipGroups.forEach { addChipGroup(container, it) }
    }

    // 存储初始选中状态
    private val initialSelectedItems = mutableMapOf<String, List<String>>()

    // 初始化选中状态,同时保存初始状态
    private fun initSelectedStates() {
        chipGroups.forEach { group ->
            // 收集所有初始选中的item
            val initiallySelected = group.items.filter { it.isSelected }.map { it.id }
            initialSelectedItems[group.groupId] = initiallySelected

            // 初始化当前选中状态
            selectedItems[group.groupId] = initiallySelected.toMutableList()
        }
    }

    // 重置所有ChipGroup到初始状态
    fun resetToInitialState() {
        // 恢复选中状态
        selectedItems.clear()
        initialSelectedItems.forEach { (groupId, ids) ->
            selectedItems[groupId] = ids.toMutableList()
        }

        // 更新UI
        val container = findViewById<LinearLayout>(R.id.container_chip_groups)
        for (i in 0 until container.childCount) {
            val groupView = container.getChildAt(i)
            val chipGroup = groupView.findViewById<ChipGroup>(R.id.chip_group)
            val groupData = chipGroups[i]

            // 清除当前选中
            chipGroup.clearCheck()

            // 恢复初始选中
            initialSelectedItems[groupData.groupId]?.let { initialIds ->
                for (j in 0 until chipGroup.childCount) {
                    val chip = chipGroup.getChildAt(j) as Chip
                    if (initialIds.contains(chip.tag)) {
                        chip.isChecked = true
                    }
                }
            }
        }
    }

    private fun addChipGroup(container: LinearLayout, groupData: ChipGroupData) {
        // 加载组布局
        val groupView = layoutInflater.inflate(R.layout.item_chip_group, container, false)
        val groupTitle = groupView.findViewById<TextView>(R.id.group_title)
        val chipGroup = groupView.findViewById<ChipGroup>(R.id.chip_group)

        // 设置组标题
        groupTitle.text = groupData.title
        groupTitle.setTextAppearance(groupData.titleTextAppearance)

        // 根据是否多选设置ChipGroup的单选模式
        chipGroup.isSingleSelection = !groupData.isMultiSelect

        // 添加Chip到组
        groupData.items.forEach { item ->
            val chip = createChip(item, groupData)
            chipGroup.addView(chip)
        }

        // 添加到容器
        container.addView(groupView)
    }

    private fun createChip(item: ChipItem, groupData: ChipGroupData): Chip {
        return Chip(context).apply {
            text = item.text
            tag = item.id
            isCheckable = true
            isChecked = item.isSelected
            // 隐藏Chip图标
            isChipIconVisible = false
            isCheckedIconVisible = false

            // 创建颜色状态列表
            val backgroundStateList = createColorStateList(
                groupData.selectedBackgroundColor,
                groupData.unselectedBackgroundColor
            )

            val textColorStateList = createColorStateList(
                groupData.selectedTextColor,
                groupData.unselectedTextColor
            )

            val strokeColorStateList = createColorStateList(
                groupData.selectedStrokeColor,
                groupData.unselectedStrokeColor
            )

            // 应用样式
            chipBackgroundColor = backgroundStateList
            setTextColor(textColorStateList)
            chipStrokeColor = strokeColorStateList
            chipStrokeWidth = groupData.chipStrokeWidth.dpToPx()
            shapeAppearanceModel = ShapeAppearanceModel.builder()
                .setTopLeftCornerSize(groupData.chipCornerRadius.dpToPx())
                .setTopRightCornerSize(groupData.chipCornerRadius.dpToPx())
                .setBottomRightCornerSize(groupData.chipCornerRadius.dpToPx())
                .setBottomLeftCornerSize(groupData.chipCornerRadius.dpToPx()).build()

            // 选中状态变化监听 - 根据单选/多选处理
            setOnCheckedChangeListener { _, isChecked ->
                val groupId = groupData.groupId
                // 确保选中列表已初始化
                if (!selectedItems.containsKey(groupId)) {
                    selectedItems[groupId] = mutableListOf()
                }

                val selectedList = selectedItems[groupId]!!

                if (isChecked) {
                    // 如果是单选模式,先清空再添加
                    if (!groupData.isMultiSelect) {
                        selectedList.clear()
                    }
                    selectedList.add(item.id)
                } else {
                    // 取消选中时从列表移除
                    selectedList.remove(item.id)
                }
            }
        }
    }

    private fun createColorStateList(selectedColor: Int, defaultColor: Int): ColorStateList {
        return ColorStateList(
            arrayOf(
                intArrayOf(android.R.attr.state_checked),
                intArrayOf()
            ),
            intArrayOf(
                selectedColor,
                defaultColor
            )
        )
    }

    // DP转PX工具方法
    private fun Number.dpToPx(): Float {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            this.toFloat(),
            context.resources.displayMetrics
        )
    }

    // Builder模式
    class Builder(private val context: Context) {
        private var title: String = "筛选"
        private var chipGroups: List<ChipGroupData> = emptyList()
        private var confirmButtonText: String = "确认"
        private var cancelButtonText: String = "重置"
        private var onConfirmListener: OnConfirmListener? = null
        private var themeResId: Int = R.style.BottomSheetDialogStyle
        private var selectedTheme = DialogThemeManage.RED

        fun setTitle(title: String) = apply { this.title = title }
        fun setChipGroups(chipGroups: List<ChipGroupData>) = apply { this.chipGroups = chipGroups }
        fun setConfirmButtonText(text: String) = apply { this.confirmButtonText = text }
        fun setCancelButtonText(text: String) = apply { this.cancelButtonText = text }
        fun setOnConfirmListener(listener: OnConfirmListener) =
            apply { this.onConfirmListener = listener }

        fun setTheme(@StyleRes themeResId: Int) = apply { this.themeResId = themeResId }
        fun setTheme(theme: DialogThemeManage) = apply { this.selectedTheme = theme }

        fun build(): MultiChipGroupBottomSheet {
            ChipGroupData.init(context)
            return MultiChipGroupBottomSheet(
                context,
                selectedTheme,
                title,
                chipGroups,
                confirmButtonText,
                cancelButtonText,
                onConfirmListener
                    ?: throw IllegalArgumentException("OnConfirmListener must be set"),
                themeResId
            )
        }
    }
}

应用示例

kotlin 复制代码
private var dialog: MultiChipGroupBottomSheet? = null
private fun showMultiChipDialog() {
    //roleType  
    val typeItems = listOf(
        MultiChipGroupBottomSheet.ChipItem("-1", "条目1"),
        MultiChipGroupBottomSheet.ChipItem("-2", "条目2"),
        MultiChipGroupBottomSheet.ChipItem("-3", "条目3"),
        MultiChipGroupBottomSheet.ChipItem("1", "条目4"),
        MultiChipGroupBottomSheet.ChipItem("0", "条目5")
    )
    // createSort 邀请时间排序(0:由近到远,1:由远到近)
    val sortItems = listOf(
        MultiChipGroupBottomSheet.ChipItem("0", "由近到远"),
        MultiChipGroupBottomSheet.ChipItem("1", "由远到近"),
    )
    // incomeSort 获得奖励时间排序(0:由近到远,1:由远到近)
    val sortTimeItems = listOf(
        MultiChipGroupBottomSheet.ChipItem("0", "由近到远"),
        MultiChipGroupBottomSheet.ChipItem("1", "由远到近"),
    )
    // 创建Chip组
    val chipGroups = listOf(
        MultiChipGroupBottomSheet.ChipGroupData(
            "type",
            "多选条目",
            typeItems,
            isMultiSelect = true
        ),
        MultiChipGroupBottomSheet.ChipGroupData("sort_invite", "邀请时间排序", sortItems),
        MultiChipGroupBottomSheet.ChipGroupData(
            "sort_reward",
            "获得奖励时间排序",
            sortTimeItems
        )

    )

    // 显示对话框
    dialog = MultiChipGroupBottomSheet.Builder(this)
        .setChipGroups(chipGroups)
        .setOnConfirmListener(object : MultiChipGroupBottomSheet.OnConfirmListener {
            override fun onConfirm(selectedItems: Map<String, List<String>>) {
                println("selectedItems: $selectedItems")
                val roleType = if (selectedItems.containsKey("type")) {
                    selectedItems["type"]
                } else {
                    emptyList()
                }
                val createSort = if (selectedItems.containsKey("sort_invite")) {
                    selectedItems["sort_invite"]
                } else {
                    emptyList()
                }
                val incomeSort = if (selectedItems.containsKey("sort_reward")) {
                    selectedItems["sort_reward"]
                } else {
                    emptyList()
                }
                // 处理选择结果
                Toast.makeText(
                    this@MainActivity,
                    "roleType: $roleType, createSort: $createSort, incomeSort: $incomeSort",
                    Toast.LENGTH_SHORT
                ).show()
            }
        })
        .build()
}

效果展示

相关推荐
whysqwhw2 小时前
安卓图片性能优化技巧
android
Yyyy4823 小时前
MyCAT基础概念
android
Android轮子哥3 小时前
尝试解决 Android 适配最后一公里
android
雨白4 小时前
OkHttp 源码解析:enqueue 非同步流程与 Dispatcher 调度
android
风往哪边走5 小时前
自定义仿日历组件弹框
android
没有了遇见5 小时前
Android 外接 U 盘开发实战:从权限到文件复制
android
Monkey-旭6 小时前
Android 文件存储机制全解析
android·文件存储·kolin
zhangphil7 小时前
Android Coil 3拦截器Interceptor计算单次请求耗时,Kotlin
android·kotlin
DokiDoki之父7 小时前
多线程—飞机大战排行榜功能(2.0版本)
android·java·开发语言