Android Jetpack Compose - SearchBar(搜索栏)、Tab(标签页)、时间选择器、TooltipBox(工具提示)

一、SearchBar(搜索栏)

kotlin 复制代码
// 输入的内容
var query by remember { mutableStateOf("") }

// 搜索栏是否展开
var expanded by remember { mutableStateOf(false) }

// 输入的内容
val suggestions = listOf("建议 1", "建议 2", "建议 3")

Box(
    modifier = Modifier.fillMaxSize()
) {
    SearchBar(
        modifier = Modifier.align(Alignment.TopCenter),
        expanded = expanded,

        // 点击搜索栏时,系统会调用这个回调,传入新的展开状态(it),这里把它赋值给 expanded
        onExpandedChange = { expanded = it },

        // 定义输入框
        inputField = {
            SearchBarDefaults.InputField(
                query = query,

                // 输入新内容时,系统会调用这个回调,传入新内容(it),这里把它赋值给 query
                onQueryChange = { query = it },

                // 点击键盘上的"搜索"按钮时触发
                onSearch = { expanded = false },
                expanded = expanded,
                onExpandedChange = { expanded = it },
                placeholder = { Text("请输入搜索内容") },

                // leadingIcon:组件左侧 / 前导位置的图标,例如,输入框前面放一个搜索图标
                leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },

                // trailingIcon:组件右侧 / 尾部位置的图标,例如,输入框后面放一个清空图标,或者密码切换图标
                trailingIcon = {
                    if (expanded && query.isNotEmpty()) {
                        IconButton(
                            onClick = {
                                query = ""
                            }
                        ) {
                            Icon(Icons.Default.Close, contentDescription = null)
                        }
                    }
                })
        }
    ) {
        LazyColumn {
            items(
                count = suggestions.size,
            ) { index ->
                Text(
                    text = suggestions[index],
                    modifier = Modifier
                        .fillMaxWidth()
                        .clickable {
                            query = suggestions[index]
                            expanded = false
                        }
                        .padding(16.dp)
                )
            }
        }
    }
}

二、Tab(标签页)

1、基本介绍
  1. Tab 体系用于实现可切换的页面导航,主要有三个组件:Tab(单个标签页)、PrimaryTabRow(主要标签栏)、SecondaryTabRow(次要标签栏)

  2. Tab 是单个标签页的 UI 定义,不能单独使用,需要放在 PrimaryTabRow 或 SecondaryTabRow 中

2、演示
kotlin 复制代码
var selectedTab by remember { mutableStateOf(0) }
val tabs = listOf("首页", "发现", "我的")

PrimaryTabRow(
    selectedTabIndex = selectedTab,
) {
    tabs.forEachIndexed { index, title ->
        Tab(
            selected = selectedTab == index,
            onClick = { selectedTab = index },
            text = { Text(title) }
        )
    }
}

三、时间选择器

kotlin 复制代码
val context = LocalContext.current

val currentTime = Calendar.getInstance()
val timePickerState = rememberTimePickerState(
    initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
    initialMinute = currentTime.get(Calendar.MINUTE),
    is24Hour = true,
)

Box(
    modifier = Modifier.fillMaxSize()
) {
    TimePicker(
        modifier = Modifier.align(Alignment.TopCenter),
        state = timePickerState,
    )

    Button(
        modifier = Modifier.align(Alignment.BottomCenter),
        onClick = {
            Toast.makeText(
                context,
                "选择的时间为 ${timePickerState.hour}:${timePickerState.minute}",
                Toast.LENGTH_SHORT
            ).show()
        }
    ) {
        Text("确认")
    }
}
kotlin 复制代码
val context = LocalContext.current

val currentTime = Calendar.getInstance()
val timePickerState = rememberTimePickerState(
    initialHour = currentTime.get(Calendar.HOUR_OF_DAY),
    initialMinute = currentTime.get(Calendar.MINUTE),
    is24Hour = true,
)

Box(
    modifier = Modifier.fillMaxSize()
) {
    TimeInput(
        modifier = Modifier.align(Alignment.TopCenter),
        state = timePickerState,
    )

    Button(
        modifier = Modifier.align(Alignment.BottomCenter),
        onClick = {
            Toast.makeText(
                context,
                "选择的时间为 ${timePickerState.hour}:${timePickerState.minute}",
                Toast.LENGTH_SHORT
            ).show()
        }
    ) {
        Text("确认")
    }
}

四、TooltipBox(工具提示)

  1. 基本使用
kotlin 复制代码
Box(
    modifier = Modifier.fillMaxSize(),
    contentAlignment = Alignment.Center
) {
    TooltipBox(
        state = rememberTooltipState(),
        positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
        tooltip = {
            PlainTooltip { Text("收藏此文章") }
        },
    ) {
        IconButton(
            onClick = {}
        ) {
            Icon(
                imageVector = Icons.Filled.Favorite,
                contentDescription = "收藏"
            )
        }
    }
}
  1. 更复杂的富文本提示
kotlin 复制代码
Box(
    modifier = Modifier.fillMaxSize(),
    contentAlignment = Alignment.Center
) {
    TooltipBox(
        state = rememberTooltipState(),
        positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
        tooltip = {
            RichTooltip(
                title = { Text("添加到收藏夹") },
                action = {
                    TextButton(
                        onClick = {}
                    ) {
                        Text("知道了")
                    }
                }
            ) {
                Text("收藏后可在个人中心快速找到")
            }
        },
    ) {
        IconButton(
            onClick = {}
        ) {
            Icon(
                imageVector = Icons.Filled.Favorite,
                contentDescription = "收藏"
            )
        }
    }
}
相关推荐
_Evan_Yao2 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd3 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼3 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122663 小时前
TCP 1
java·1024程序员节
美狐美颜SDK开放平台4 小时前
准备开发直播APP?视频美颜SDK接入前的十项检查清单
android·ios·音视频·直播美颜sdk·视频美颜sdk
传奇开心果编程4 小时前
【Jetpack Compose娓娓道来】第26课:Repository模式与数据层设计——数据的唯一入口
android·移动开发·1024程序员节·jetpack compose·编程语言理论·编程框架·声明式ui
金銀銅鐵6 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手6 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
传奇开心果编程6 小时前
从替代到粒度:Compose Multiplatform 的决策模式重构已开启跨平台新时代
kotlin·移动开发·跨平台·cmp·编程语言理论·编程框架·声明式ui
paopaokaka_luck8 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节