自定义底部筛选弹框

自定义底部筛选弹框

推荐红绿蓝三种样式,可以根据需求定义主题颜色, 对某一分类进行单选设置、多选设置,返回结果为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()
}

效果展示

相关推荐
android_xc36 分钟前
Android Studio适配butterknife遇到的坑
android·ide·android studio·butterknife
2501_915918411 小时前
uni-app 项目 iOS 上架效率优化 从工具选择到流程改进的实战经验
android·ios·小程序·uni-app·cocoa·iphone·webview
00后程序员张1 小时前
如何在不同 iOS 设备上测试和上架 uni-app 应用 实战全流程解析
android·ios·小程序·https·uni-app·iphone·webview
米豆同学3 小时前
SufraceFlinger图像合成原理(3)-SurfaceFlinger中Layer的创建和销毁
android
米豆同学3 小时前
SufraceFlinger图像合成原理(2)-SurfaceFlinger与应用进程间的通信
android
用户2018792831673 小时前
uses-library:系统应用报NoClassDefFoundError问题
android
叽哥3 小时前
Kotlin学习第 4 课:Kotlin 函数:从基础定义到高阶应用
android·java·kotlin
mg6683 小时前
安卓玩机工具----安卓“搞机工具箱”最新版 控制手机的玩机工具
android·智能手机
诺诺Okami3 小时前
Android Framework- Activity启动2
android
米豆同学3 小时前
SystemUI plugin 开发
android