使用Jetpack Compose构建可折叠Card

news2025/1/13 10:33:23

使用Jetpack Compose构建可折叠Card

为何在Android应用开发中使用扩展卡片

扩展卡片在Android应用开发中广受欢迎,它们可以让开发者打造干净紧凑的用户界面,同时可以轻松展开,显示额外的内容。

通过巧妙地使用扩展卡片,开发者可以为用户提供流畅、直观的体验,用户可以在无需切换到新屏幕或环境的情况下访问更详细的信息。

这在移动应用中特别有用,因为屏幕空间有限,用户通常处于快速移动中。通过采用扩展卡片呈现信息,开发者可以减少点击和滑动次数,从而提升用户体验。

扩展卡片是增强用户体验、使应用脱颖而出的绝佳方式。

扩展卡片的明显用途和采用案例包括但不限于:

  • 展示电子商务应用中产品的额外细节
  • 在新闻应用中展示新闻文章的附加信息
  • 为待办事项列表应用中的任务提供更多详细信息
  • 在应用中展示功能的附加选项或设置
  • 在健身应用中显示用户活动摘要,并可展开以获取更多详情
  • 在食品订购应用中展示餐厅或食品项目的详细信息
  • 在财务应用中提供用户账户信息摘要,可展开以获得更多详情。

这只是展开式卡片在Android应用开发中的几个应用示例。

逐步教程:在Compose中创建可展开卡片

Jetpack Compose是使用Kotlin构建本机Android应用程序的现代UI工具包。它提供了一种更直观、更声明式的方式来构建UI组件,使开发人员能够轻松创建漂亮、响应式的用户界面。本教程将使用Jetpack Compose创建一个可展开的卡片。

步骤1:为卡片创建一个组合函数

第一步是创建一个代表卡片的组合函数。我们定义一个名为ExpandableCard的组合函数。

此函数将接受两个参数:卡片的标题和一个布尔值,用于确定卡片是否展开。

我们使用mutableStateOf创建一个名为expanded的布尔变量,用于跟踪卡片是否展开。我们将其初始化为false。

以下是这个函数的代码示例:

@Composable
fun ExpandableCard(title: String) {
var expanded by remember { mutableStateOf (false) }

  Card(
    shape = RoundedCornerShape(8.dp),
    elevation = 8.dp,
    modifier = Modifier
      .fillMaxWidth()
      .padding(16.dp)
)
  ) {
    // Card content goes here, at this state a column to hold items
  }
}

此函数创建了一个具有圆角形状和投影阴影的卡片元素。

我们使用Card组合创建了一个容器,其中包含了高度、圆角和其他材料设计特征。我们将其修饰符设置为fillMaxWidth,使其占据父元素的整个宽度。

上面核心的一个方面在这一行:

var expanded by remember { mutableStateOf(false) }

让我们进行一些解释:

在Jetpack Compose中,状态是一个关键的概念,用于保存在组合函数的生命周期内可以发生变化的数据。

在这段代码中,var expanded是一个可变变量,表示ExpandableCard的当前状态。它用于确定卡片当前是展开还是折叠。

by remember { mutableStateOf(false) } 表达式使用可变状态持有器初始化了expanded 变量。

remember 函数用于缓存状态值,使其在组合函数的重新组合中保持持久。

mutableStateOf 函数用于创建一个可保存布尔值的状态持有器。在这种情况下,状态的初始值设置为"false",这意味着卡片最初是折叠的。

每当expanded变量的值发生变化时,Jetpack Compose会自动重新组合组合函数,从而更新UI以反映新状态。

我们还将卡片的宽度设置为填充可用空间,并添加一些填充以进行间距设置。我们稍后将添加卡片的内容。

步骤2:添加展开按钮

接下来,我们需要添加一个按钮,用户可以点击以展开或折叠卡片。我们将使用一个包裹卡片内容的Clickable组合来实现这一点。下面是ExpandableCard函数的更新代码:

@Composable
fun ExpandableCard(title: String) {

    var expanded by remember { mutableStateOf(false) }

    Card(
        shape = RoundedCornerShape(8.dp),
        elevation = 8.dp,
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp)
            .clickable(
                onClick = { expanded = !expanded }
            )
    ) {
        Column(
            // 卡片内容放在这里,包括标题和示例内容
        )
    }
}

我们添加了一个包裹卡片内容的Column组合。在Card上,我们添加了一个clickable修饰符。我们将使用这个修饰符来切换卡片的展开状态。

让我们详细解释一下这个clickable修饰符:

.clickable {
    onClick { expanded = !expanded }
}

.clickable 修饰符用于使一个组合函数变得可点击。在这种情况下,Card组合被设置为可点击,以便当用户点击它时触发特定操作。

onClick 方法是一个lambda表达式,在用户点击Card时执行。它通过使用"!“运算符来取反当前值,从而切换"expanded” 变量的值。这意味着如果"expanded" 是true,它将变为false,如果它是false,它将变为true。

expanded 变量用于确定卡片当前是展开还是折叠。当用户点击卡片时,onClicklambda被执行,“expanded” 的值被切换,从而更新卡片的状态。结果,组合函数被重新组合,UI更新以反映卡片的新状态。

因此,这段代码为卡片设置了切换功能,允许根据"expanded" 变量的当前状态展开或折叠。

步骤3:为卡片添加内容

现在我们有了一个可点击的列作为卡片,我们可以添加卡片的内容。这可以是Jetpack Compose UI元素的任意组合,比如文本、图片或按钮。以下是内容可能的示例:

@Composable
fun ExpandableCard(title: String) {

var expanded by remember { mutableStateOf (false) }

  Card(
    shape = RoundedCornerShape(8.dp),
    elevation = 8.dp,
    modifier = Modifier
      .fillMaxWidth()
      .padding(16.dp)
      .clickable (
                  onClick { expanded = !expanded }
      )
  ) {
    Column(
    ) {
      Text(
        text = title,
        style = MaterialTheme.typography.h4,
        modifier = Modifier.padding(8.dp)
      )
      if (expanded) {
        Text(
          text = "Content Sample for Display on Expansion of Card",
          style = MaterialTheme.typography.body1,
          modifier = Modifier.padding(8.dp)
        )
      }
    }
  }
}

在这个示例中,我们为卡片的标题添加了一个Text元素,并在卡片的内容中添加了另一个条件性的Text元素。只有在卡片展开时,我们才会显示内容。

步骤4:切换展开状态

最后,我们需要添加逻辑,以便在用户点击卡片时切换卡片的展开状态。我们可以通过使用 !expanded 来更新expanded参数来实现这一点。以下是函数的最终代码:

@Composable
fun ExpandableCard(title: String) {

var expanded by remember { mutableStateOf (false) }

  Card(
    shape = RoundedCornerShape(8.dp),
    elevation = 8.dp,
    modifier = Modifier
      .fillMaxWidth()
      .padding(16.dp)
      .clickable {
                  onClick { expanded = !expanded }
      }
  ) {
    Column(
    ) {
      Text(
        text = title,
        style = MaterialTheme.typography.h4,
        modifier = Modifier.padding(8.dp)
      )
      if (expanded) {
        Text(
          text = "Content Sample for Display on Expansion of Card",
          style = MaterialTheme.typography.body1,
          modifier = Modifier.padding(8.dp)
        )
      }
    }
  }
}

当用户点击卡片时,我们调用这个函数来反转当前展开值。

重申一下,expanded 变量用于确定卡片当前是展开还是折叠。

当用户点击卡片时,onClick lambda被执行,expanded 的值被切换,从而更新卡片的状态。

结果,组合函数被重新组合,UI更新以反映卡片的新状态。

结论

在本教程中,我们探讨了在Jetpack Compose中创建可展开卡片所需的步骤。

我们首先创建了一个卡片的组合函数,然后添加了展开按钮和卡片内容,最后添加了切换卡片展开状态的逻辑。

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

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

相关文章

磁盘阵列/视频集中存储/安防监控视频智能分析平台新功能:安全帽/反光衣/安全带AI识别详解

人工智能技术已经越来越多地融入到视频监控领域中,近期我们也发布了基于AI智能视频云存储/安防监控视频AI智能分析平台的众多新功能,该平台内置多种AI算法,可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍,支持口罩佩戴检…

基于swing的教务管理系统java jsp学生教师信息mysql源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于swing的教务管理系统 系统有3权限:管…

气传导耳机哪个好?推荐几款性能表现不错的气传导耳机

​蓝牙耳机大家都很熟悉,如果更了解一些的朋友,一定也知道气传导耳机。气传导耳机最大的好处在于不入耳佩戴更舒适,户外使用时还能听到周围环境音,不会屏蔽汽车鸣笛声,使用更加安全。但也还有很多小伙伴不知道气传导耳…

Android实现网络请求方法

Android网络请求(1) ​ 安卓开发网络请求可谓是安卓开发的灵魂,如果你不会网络请求,那么你开发的应用软件就是一具没有灵魂的枯骨。 ​ 在安卓开发中进行网络请求和java中的网络请求有异曲同工之妙,但是安卓软件毕竟的安装在我们手机上的&a…

C++入门:引用是什么

目录 1.引用的概念 2.引用的特征 3.常引用 4.引用使用场景 5.传值,传引用效率比较 6.引用与指针的区别 1.引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用…

续一:《你的医书是假的!批评付施威的《DDD诊所——聚合过大综合症》

DDD领域驱动设计批评文集 “软件方法建模师”不再考查基础题 《软件方法》各章合集 我写了一篇文章,批评付施威的《DDD诊所——聚合过大综合症》(以下简称《DDD诊所》),文章是《你的医书是假的!批评付施威的《DDD诊…

yolov5 V7.0版本 使用Pascal voc 2012 数据集训练

1、环境搭建 # 1、anaconda pycharm环境搭建 https://blog.csdn.net/weixin_45715405/article/details/132100595?spm1001.2014.3001.5502 根据上面创建一个conda的虚拟环境python版本为3.8版本# 2、yolov5 代码下载 https://github.com/ultralytics/yolov5# 3、安装需要的依…

封装公共el-form表单(记录)

1.公共表单组件 //commonForm.vue <script> import {TEXT,SELECT,PASSWORD,TEXTAREA,RADIO,DATE_PICKER } from /conf/uiTypes import { deepClone } from /utils export default {name: GFormCreator,props: {config: { // title/itemstype: Object,required: true}}…

【PHP】基础语法变量常量

文章目录 PHP简介前置知识了解静态网站的特点动态网站特点 PHP基础语法代码标记注释语句分隔(结束)符变量变量的基本概念变量的使用变量命名规则预定义变量可变变量变量传值内存分区 常量基本概念常量定义形式命名规则使用形式系统常量魔术常量 PHP简介 PHP定义&#xff1a;一…

10.应用部署

配置项目编码 配置IDEA IDE编码 不配置会出现idea内部log中文乱码&#xff0c;而外部正常的现象 增加配置代码&#xff1a; -Dfile.encodingUTF-8需要重新启动idea 配置运行看板 services docker 如果docker尚未配置&#xff0c;则docker看板不会显示&#xff0c;但可以先…

睡眠模式下如何快速唤醒电脑,看这里!

这篇文章解释了如何唤醒正在睡觉的电脑,以及如果正常方法不起作用该怎么办。 一、如何从睡眠中唤醒电脑 不管你使用的是什么操作系统,关闭睡眠模式就像唤醒电脑一样简单,你可以通过某种方式与电脑交互来完成: 移动鼠标 滑动触摸板 按键盘上的任意键 有些设备有点不同,只…

淘宝API技术解析:实现店铺所有商品接口的高效获取与处理

当涉及到淘宝店铺的所有商品接口&#xff0c;我们可以利用淘宝开放平台提供的API进行操作。 &#xff08;首先&#xff0c;我们需要确保已经在淘宝开放平台注册并创建了应用&#xff0c;并获取了相应的App Key和App Secret。&#xff09; 1. 获取授权&#xff1a;使用OAuth 2…

自组织地图 (SOM) — 介绍、解释和实现

自组织地图 &#xff08;SOM&#xff09; — 介绍、解释和实现 一、说明 什么是SOM&#xff08;self orgnize map&#xff09;自组织地图&#xff0c;是GNN类似的图神经网络的概念。因为神经网络实质上可以解释为二部图的权重&#xff0c;因此无论GNN还是SOM都有共同的神经网络…

AIGC的发展

AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;&#xff0c;即人工智能生产内容&#xff0c;是人工智能在内容领域的最新进展。AIGC利用人工智能算法通过分析大量数据集&#xff0c;自动生成具有特定风格和主题的内容。AIGC涵盖了多种应用领域&#x…

ITIL4的知识体系及必要性

官方网站 www.itilzj.com 文档资料: wenku.itilzj.com 点击进入IT管理资料库 ITIL4 的必要性及历史 在这个前所未有的变革时代&#xff0c;人们身处着被誉为“第四次工业革命”的时代&#xff0c;这个时代催生出了一个日益加速、变得愈发错综复杂的环境。在这种环境下&#xf…

电脑文件夹密码怎么设置?文件夹加密介绍

文件夹是电脑管理文件必不可少的工具&#xff0c;而我们为了保护文件夹的数据安全&#xff0c;通常会采用设置密码的方法来保护文件夹。那么&#xff0c;电脑文件夹密码该怎么设置呢&#xff1f; 文件夹加密超级大师 文件夹加密超级大师不但可以为电脑文件夹设置密码&#xff…

阿里云大语言模型(LLM)实战训练营,火热开营中!

简介&#xff1a;大语言模型实战训练营已正式开营&#xff0c;汇集阿里云、黑马程序员多位AI领域资深技术专家手把手带您快速实现大语言模型从入门到应用落地&#xff01;完成课程学习任务更有机会领取LAMY钢笔、小米充电宝、双肩包等精美礼品&#xff0c;快来一起学习体验吧~ …

MySQL高可用Orchestrator

目录 一 Orchestrator简介 二 Orchestrator功能 1 Discovery(发现复制拓扑) 2 Refactoring(重构复制拓扑) 3 Recovery(恢复主库故障) 三 orchestrator支持的操作方式 四 部署要求 五 下载 六 安装 1 下载软件包 2 解压软件包 3 创建账号 第一种是 orc后端MySQL数据…

识别图片翻译怎么操作?几个好方法了解一下

图片翻译是一项非常有用的工具&#xff0c;可以让人们轻松地识别和翻译图片中的文字&#xff0c;对于一些步入职场的小伙伴尤其是从事文案编辑的朋友更是一个需要的技能&#xff0c;很多时候我们参考的多语言文献资料都是图片的格式&#xff0c;翻译内容的话会比较麻烦&#xf…

【python】python开源代理ip池

一、前言 随着互联网的不断发展&#xff0c;越来越多的应用需要使用高匿代理IP才能访问目标网站&#xff0c;而代理IP作为一种能够隐藏本机真实IP地址的工具&#xff0c;在网络抓取、搜索引擎排名、广告投放、反爬虫等方面有着广泛的应用场景。但是&#xff0c;由于代理IP的稳…