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 = "收藏"
            )
        }
    }
}
相关推荐
音视频牛哥几秒前
从数字孪生到机器人操控:Android Unity3D下RTMP/RTSP多路低延迟播放实践
android·unity·音视频·unity rtsp播放器·unity rtmp播放器·rtsp player·rtmp player
Jul1en_25 分钟前
【Java 脚手架】封装通用工具类-1
java·spring boot·分布式·spring·spring cloud
关于不上作者榜就原神启动那件事1 小时前
从 MDC 到 Agent:我手搓的文档路由协议,在 Spring AI Alibaba 里找到了正式实现
java·人工智能·spring·ai·agent
用户69371750013841 小时前
了解一下 Agent Harness
android·前端·后端
刘名喜1 小时前
第09篇-协程基础-Kotlin异步编程
开发语言·kotlin·springboot
淡淡的香烟1 小时前
Android15适配16kb完整版
android
亦暖筑序1 小时前
重新认识 AgentScope-Java 2.0:ReActAgent 负责推理,HarnessAgent 负责运行
java·后端·agent
IKUN家族1 小时前
Spring MVC(三)
运维·服务器·spring boot·spring·servlet·java-ee
木井巳1 小时前
【DFS解决floodfill算法】岛屿的最大面积
java·算法·leetcode·深度优先
运维大师2 小时前
【K8S 运维实战】34-多集群管理Karmada
java·运维·kubernetes