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 = "收藏"
            )
        }
    }
}
相关推荐
27669582922 小时前
token1005 算法分析
java·前端·javascript·token·token1005·携程酒店·token算法分析
海寻山2 小时前
Java内部类:4种类型+实战场景+面试避坑
java·开发语言·面试
Lsk_Smion2 小时前
Hot100(开刷) 之 长度最小的数组--删除倒数第N个链表--层序遍历
java·数据结构·算法·kotlin
恋猫de小郭2 小时前
Flutter PC 多窗口最新进展,底层原生窗口句柄支持已合并
android·前端·flutter
2601_950703942 小时前
PyCharm性能优化终极指南
java
yzp-3 小时前
Spring 三级缓存 ---- 简单明了豆包版
java·mysql·spring
隐退山林3 小时前
JavaEE进阶:导读&SpringBoot快速上手
java·spring boot·java-ee
送秋三十五3 小时前
Spring 源码---------Spring Core
java·数据库·spring
悟空码字3 小时前
SpringBoot + 微信支付实现“扫码开门,取货自动扣款”售货柜
java·spring boot·后端