Jetpack Compose 中下拉框实现

news2024/11/25 7:47:27

下拉菜单主要 以下三种实现:

@ExperimentalMaterialApi
@Composable
fun ExposedDropdownMenuBox(
    expanded: Boolean,
    onExpandedChange: (Boolean) -> Unit,
    modifier: Modifier = Modifier,
    content: @Composable ExposedDropdownMenuBoxScope.() -> Unit
)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实现代码:

@file:OptIn(ExperimentalMaterial3Api::class)

package com.example.myapplication.ui.menu

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview


@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DropdownMenuDemo() {
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        DropdownMenuSample()
        ExposedDropdownMenuSample()
        EditableExposedDropdownMenuSample()
    }

}


@Composable
fun DropdownMenuSample() {
    var selectedOption by remember { mutableStateOf("Option 1") }
    var isExposedDropdownOpen by remember { mutableStateOf(false) }
    Column() {
        DropdownMenu(
            expanded = isExposedDropdownOpen,
            onDismissRequest = { isExposedDropdownOpen = false }
        ) {
            DropdownMenuItem(onClick = {
                selectedOption = "Option 1"
                isExposedDropdownOpen = false
            }, text = {
                Text("Option 1")
            })
            DropdownMenuItem(onClick = {
                selectedOption = "Option 2"
                isExposedDropdownOpen = false
            }, text = {
                Text("Option 2")
            })
            DropdownMenuItem(onClick = {
                selectedOption = "Option 3"
                isExposedDropdownOpen = false
            }, text = {
                Text("Option 3")
            })
        }

        Button(onClick = {
            isExposedDropdownOpen = true
        }) {
            Text(text = "点击")
        }
    }
}

@Composable
fun ExposedDropdownMenuSample() {
    val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
    var expanded by remember { mutableStateOf(false) }
    var selectedOptionText by remember { mutableStateOf(options[0]) }
    // We want to react on tap/press on TextField to show menu
    ExposedDropdownMenuBox(
        expanded = expanded,
        onExpandedChange = {
            expanded = !expanded
        }
    ) {
        TextField(
            readOnly = true,
            value = selectedOptionText,
            onValueChange = { },
            label = { Text("Label") },
            trailingIcon = {
                ExposedDropdownMenuDefaults.TrailingIcon(
                    expanded = expanded
                )
            },
            colors = ExposedDropdownMenuDefaults.textFieldColors(),
            modifier = Modifier.menuAnchor()
        )

        ExposedDropdownMenu(
            expanded = expanded,
            onDismissRequest = {
                expanded = false
            },
        ) {
            options.forEach { selectionOption ->
                DropdownMenuItem(
                    text = {
                        Text(selectionOption)
                    },
                    onClick = {
                        selectedOptionText = selectionOption
                        expanded = false
                    }
                )
            }
        }
    }
}

@Composable
fun EditableExposedDropdownMenuSample() {
    val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
    var expanded by remember { mutableStateOf(false) }
    var selectedOptionText by remember { mutableStateOf("") }
    ExposedDropdownMenuBox(
        expanded = expanded,
        onExpandedChange = {
            expanded = !expanded
        }
    ) {
        TextField(
            value = selectedOptionText,
            onValueChange = {
                selectedOptionText = it
                expanded = true
            },
            label = { Text("Label") },
            trailingIcon = {
                ExposedDropdownMenuDefaults.TrailingIcon(
                    expanded = expanded
                )
            },
            colors = ExposedDropdownMenuDefaults.textFieldColors(),
            modifier = Modifier.menuAnchor()
        )
        // filter options based on text field value
        val filteringOptions =
            options.filter { it.contains(selectedOptionText, ignoreCase = true) }
        if (filteringOptions.isNotEmpty()) {
            ExposedDropdownMenu(
                expanded = expanded,
                onDismissRequest = {
                    expanded = false
                }
            ) {
                filteringOptions.forEach { selectionOption ->
                    DropdownMenuItem(
                        text = {
                            Text(text = selectionOption)
                        },
                        onClick = {
                            selectedOptionText = selectionOption
                            expanded = false
                        }
                    )
                }
            }
        }
    }
}


@Preview
@Composable
fun DropdownMenuDemoPreview() {
    DropdownMenuDemo()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1167670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云智慧联合北航提出智能运维(AIOps)大语言模型及评测基准

随着各行业数字化转型需求的不断提高,人工智能、云计算、大数据等新技术的应用已不仅仅是一个趋势。各行业企业和组织纷纷投入大量资源,以满足日益挑剔的市场需求,追求可持续性和竞争力,这也让运维行业迎来了前所未有的挑战和机遇…

Apollo云实验:使用Sim control仿真自动驾驶

使用Sim control仿真自动驾驶 概述Sim control仿真自动驾驶启动DreamView仿真系统 实验目的福利活动 主页传送门:📀 传送 概述 自动驾驶汽车在实现落地应用前,需要经历大量的道路测试来验证算法的可行性和系统的稳定性,但道路测试…

内网穿透配置-Cpolar-Ngrok

文章目录 一、Cpolar1、cpolar软件的使用:(1)下载与安装(2)cpolar指定authtoken(3)获取临时域名(4)验证临时域名有效性 二、Ngrok1、配置内网穿透(1&#xff…

数据挖掘题目:设ε= 2倍的格网间距,MinPts = 6, 采用基于1-范数距离的DBSCAN算法对下图中的实心格网点进行聚类,并给出聚类结果(代码解答)

问题 代码 import matplotlib.pyplot as plt import numpy as np from sklearn.cluster import DBSCAN #pip install matplotlib #pip install numpy #pip install scikit-learn # 实心格网点的坐标 solid_points np.array([[1, 1], [2, 1],[3, 1], [1, 2], [2, 2], [3, 2],[…

【蓝桥杯省赛真题41】Scratch电脑开关机 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch电脑开关机 一、题目要求 编程实现 二、案例分析 1、角色分析

ucos_conf、ucos_src和ucos_port

目录 ucos_conf 文件夹ucos_src 文件夹ucos_port 文件夹 在 uC/OS-II 中,ucos_conf、ucos_src 和 ucos_port 是三个不同的文件夹,它们的作用和功能有所不同: ucos_conf 文件夹 ucos_conf 文件夹:ucos_conf 文件夹包含了 uC/OS-II…

高阶数据结构学习 —— 图(4)

文章目录 1、最短路径2、单源最短路径——Dijkstra算法(正权值)3、单源最短路径——BellmanFord算法1、BF优化:SPFA2、BF算法解决不了带负权回路的问题,实际上哪一个算法都无法求出来 4、多源最短路径——Floyd-Warshall算法 1、最…

汇编-注释

注释有两种说明方法: ●单行注释,用分号(;)开始。汇编器将忽略在同一行上分号之后的所有字符。 ●块注释, 用COMMENT伪指令和一个用户指定的符号开始。汇编器将忽略其后所有 的文本行,直到该用户指定的符号出现为止。…

让学生自助查询成绩的几种方法

在这个信息爆炸的时代,让学生能方便快捷的获取自己的成绩,无疑成为了老师们的一大挑战。我给各位老师介绍几种实用的方法,帮你实现在线发布成绩。 1. 使用在线表格或数据库 使用在线表格或数据库可以让你轻松地存储、管理和发布学生的成绩。…

Python接口自动化测试(接口状态)

本节开始,开始介绍python的接口自动化测试,首先需要搭建python开发环境,到https://www.python.org/下载python 版本直接安装就以了,建议 下载python2.7.11版本,当然,也是可以下载python最新版本的。 接口测…

课题学习(十)----阅读《基于数据融合的近钻头井眼轨迹参数动态测量方法》论文笔记

一、 引言 该论文针对三轴加速度计、磁通门和速率陀螺随钻测量系统,建立了基于四元数井眼轨迹参数测量模型,并依据状态方程和量测方程,应用2个扩卡尔曼滤波器、1个无迹卡尔曼滤波器和磁干扰校正系统对加速度计、磁通门信号进行滤波、校正&…

探索主题建模:使用LDA分析文本主题

在数据分析和文本挖掘领域,主题建模是一种强大的工具,用于自动发现文本数据中的隐藏主题。Latent Dirichlet Allocation(LDA)是主题建模的一种常用技术。本文将介绍如何使用Python和Gensim库执行LDA主题建模,并探讨主题…

什么是TCY油封?

机械由无数组件协同工作以确保平稳运行,其中一种不可或缺的部件是油封,特别是TCY油封。本文旨在阐明TCY油封的应用、其重要性以及它们如何提高机械的整体效率。 TCY油封主要用于轴密封。轴是一种旋转机器元件,横截面通常为圆形,用…

RAR Extractor v11.20(mac解压缩软件)

RAR Extractor是一款专门用于解压RAR格式压缩文件的软件,以下是关于RAR Extractor的详细介绍: 强大的解压功能:RAR Extractor能够解压RAR格式的压缩文件,无论是单一的RAR文件还是RAR文件包,都可以通过RAR Extractor进…

Python操作CMD大揭秘!轻松玩转命令行控制

导语: 命令行界面(Command Line Interface,简称CLI)是计算机操作系统中一种基于文本的用户界面,通过输入命令来与计算机进行交互。Python作为一门强大的编程语言,提供了丰富的库和模块,可以方便…

竖拍的视频怎么做二维码?竖版视频二维码制作技巧

为了方便视频的展示和传播,现在将视频生成二维码后来使用的方式越来越常见,很多做二维码工具都可以制作视频二维码,但是无法设置下载权限或者播放竖版视频。那么如果做有下载功能的视频码该如何制作,可能很多小伙伴都不知道怎么做…

(免费领源码)java#springboot#mysql网上商城系统的设计与实现08789-计算机毕业设计项目选题推荐

摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设网上商城系统。 本设…

Google play开发者账号注册的实用技巧与建议——身份验证、付款资料、支付成功注册失败?

总所周知,如果要在Google paly应用商店上发布应用,需要先注册谷歌开发者账号。但随着发展,谷歌对开发者账号的审核越来越严格,要求越来越多,账号注册通过率越来越低,频繁被封,令开发者们苦恼不已…

「更新」Topaz Video AI v4.0.3中文版

Topaz Video AI是一款功能强大的视频处理软件,它利用人工智能技术对视频进行智能分析和优化,旨在为用户提供高效、智能的视频编辑和增强功能。 首先,Topaz Video AI具备强大的视频修复功能。它可以自动识别并修复视频中的各种问题&#xff0…

物联网AI MicroPython传感器学习 之 MLX90614红外测温传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 MLX90614是一款由迈来芯公司提供的低成本红外温度计,用于非接触式温度测量,红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有不…