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