《探索 Jetpack Compose:构建现代化 Android UI 的利器》

Jetpack Compose 是谷歌推出的现代化 UI 框架,用于简化 Android 应用开发中的 UI 构建。它使用声明式编程方式,允许开发者以简洁直观的方式创建动态和响应式的 UI。本文将从基础概念到进阶用法,带你全面了解 Compose 的核心功能和使用技巧。

基本组件使用 

1. Text 组件 

Text 组件用于在界面上显示文本。其使用非常简单,只需在可组合函数中调用 Text 并传入要显示的文本内容即可 

import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.runtime.Composable@Composable
fun SimpleTextUI() {Column {Text("这是 Compose 中的一段文本")}
}

 这里创建了一个名为 SimpleTextUI 的可组合函数,内部使用 Column 组件垂直排列子组件,并在其中添加了一个 Text 组件来显示指定文本。

2. Button 组件 

Button 组件用于创建可点击的按钮。通常与点击事件处理结合使用 

import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember@Composable
fun ButtonUI() {val clickCount = remember { mutableStateOf(0) }Column {Button(onClick = { clickCount.value++ }) {Text("点击我")}Text("按钮已被点击 ${clickCount.value} 次")}
}

 在这个例子中,通过 remember 和 mutableStateOf 来创建并记住一个可观察的点击次数状态。每次点击按钮时,点击次数会增加,并在下方的 Text 组件中实时显示更新后的点击次数

3. 布局组件  Column 和 Row

 Column 用于垂直排列子组件,Row 用于水平排列子组件。它们是构建复杂 UI 布局的基础。例如,创建一个简单的登录界面布局

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material.TextField
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable@Composable
fun LoginUI() {Column {TextField(value = "", onValueChange = {})TextField(value = "", onValueChange = {})Row {Button(onClick = {}) {Text("登录")}Button(onClick = {}) {Text("注册")}}}
}

 在 LoginUI 函数中,首先使用 Column 垂直排列两个 TextField 组件用于输入用户名和密码,然后使用 Row 水平排列登录和注册按钮

4. 状态管理 

在 Compose 中,状态管理是构建动态 UI 的关键。常用的方式是结合 remember 和 mutableStateOf。例如,实现一个简单的计数器应用 

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp@Composable
fun CounterApp() {val count = remember { mutableStateOf(0) }Column(modifier = Modifier.fillMaxWidth(),horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.Center) {Text(text = "计数: ${count.value}")Spacer(modifier = Modifier.height(16.dp))Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.Center) {Button(onClick = { count.value = count.value - 1 }) {Text(text = "减少")}Spacer(modifier = Modifier.width(16.dp))Button(onClick = { count.value = count.value + 1 }) {Text(text = "增加")}}}
}

这里通过 remember {mutableStateOf (0) } 创建了一个可记忆的计数器状态 count。当点击增加或减少按钮时,count.value 会相应改变,从而触发包含 Text 组件的 Column 组件重组,更新界面显示的计数 

 5. 主题和样式 

Compose 提供了强大的主题系统来统一应用的外观。首先可以定义自己的主题颜色等属性 

import androidx.compose.material.MaterialTheme
import androidx.compose.material.lightColors
import androidx.compose.runtime.Composableval MyColors = lightColors(primary = Color.Blue,secondary = Color.Green
)@Composable
fun MyAppTheme(content: @Composable () -> Unit) {MaterialTheme(colors = MyColors,content = content)
}

 然后在其他组件中应用这个主题:

import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.runtime.Composable@Composable
fun ThemedText() {MyAppTheme {Column {Text("这段文本在自定义主题中", color = MaterialTheme.colors.primary)}}
}

这样就可以使文本的颜色根据自定义主题中的主颜色来显示,实现了整个应用 UI 风格的统一和定制 

6. 与其他组件集成   与 ViewModel 集成

在遵循 MVVM 架构的 Android 应用中,Compose 可以与 ViewModel 无缝协作。例如,假设有一个 UserViewModel 用于获取和管理用户信息 

class UserViewModel : ViewModel() {val user = MutableLiveData<User>()// 假设这里有方法来获取用户信息,如从网络或者数据库fun fetchUser() {//...}
}

在 Compose 中使用如下: 

import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.compose.viewModel@Composable
fun UserInfoUI() {val viewModel: UserViewModel = viewModel()viewModel.fetchUser()val user = viewModel.user.valueColumn {if (user!= null) {Text("用户名: ${user.name}")Text("用户年龄: ${user.age}")}}
}

 通过 viewModel 函数获取 UserViewModel 的实例,调用 fetchUser 方法获取用户信息,并在 UI 中显示用户的姓名和年龄。

7. 与导航(Navigation)集成 

Compose 可以与 Android 的导航组件集成,实现不同屏幕之间的导航。例如,定义两个 Compose 屏幕 ScreenA 和 ScreenB 并设置导航: 

import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController@Composable
fun ScreenA(navController: NavController) {Column {Text("这是屏幕 A")Button(onClick = { navController.navigate("screenB") }) {Text("前往屏幕 B")}}
}@Composable
fun ScreenB() {Column {Text("这是屏幕 B")}
}@Composable
fun NavigationApp() {val navController = rememberNavController()NavHost(navController = navController,startDestination = "screenA") {composable("screenA") {ScreenA(navController)}composable("screenB") {ScreenB()}}
}

 这里 NavigationApp 函数是导航应用的入口。通过 rememberNavController 创建导航控制器,NavHost 定义导航宿主,composable 函数定义不同屏幕及其对应的路径。在 ScreenA 中点击按钮可通过导航控制器导航到 ScreenB

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生活大爆炸版石头剪刀布(洛谷P1328)

生活大爆炸版石头剪刀布(洛谷P1328) [NOIP2014 提高组] 前言&#xff1a; 由于洛谷发布题解有限制&#xff0c;所以在CSDN上发布洛谷题解。 所有题解均是Java语言, 但是思路是相同的 每篇都是刷题日常&#xff0c;尽量讲清楚算法逻辑。 希望有问题还请大佬们指导&#xff01; …

Linux安装Python2.7.5(centos自带同款)

卸载已安装的python,防止版本兼容问题 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps 删除残余文件 whereis python |xargs rm -frv 安装前提是已安装gcc和g gcc --version g --version 下载安装python2.7.5 https://www.python.org/downloads/release/pyt…

【CKA】Kubernetes(k8s)认证之CKA考题讲解

CKA考题讲解 0.考试101 0.1 kubectl命令⾃动补全 在 bash 中设置当前 shell 的⾃动补全&#xff0c;要先安装 bash-completion 包。 echo "source <(kubectl completion bash)" >> ~/.bashrc还可以在补全时为 kubectl 使⽤⼀个速记别名&#xff1a; al…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

PHP语法学习(第六天)-条件语句,关联数组

&#x1f4a1;依照惯例&#xff0c;回顾一下昨天讲的内容 PHP语法学习(第五天)主要讲了PHP中的常量和运算符的运用。 &#x1f525; 想要学习更多PHP语法相关内容点击“PHP专栏” 今天给大家讲课的角色是&#x1f34d;菠萝吹雪&#xff0c;“我菠萝吹雪吹的不是雪&#xff0c;而…

java中的数组(2)

大家好&#xff0c;我们今天继续来看java中数组这方面的知识点&#xff0c;那么话不多说&#xff0c;我们直接开始。 一.数组的使用 1.数组中元素访问 数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,数组可以通过下标访问其任意位置的元素. 也可以进行修改…

数据结构 (36)各种排序方法的综合比较

一、常见排序方法分类 插入排序类 直接插入排序&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。希尔排序&#xff1a;是插入排序的一种改进版本&#xff0c;先将整个待排序的记录序列分割成为…

计算机网络安全 —— 实体鉴别与生成大随机数

一、实体鉴别# ​ 实体鉴别&#xff08;经常简称为鉴别&#xff09;就是一方验证另一方身份的技术。一个实体可以是人、客户/服务器进程等。这里仅讨论如何鉴别通信对端 实体的身份&#xff0c;即验证正在通信的对方确实是所认为的通信实体&#xff0c;而不是其他的假冒者。进…

【SpringBug】lombok插件中@Data不能生成get和set方法

一&#xff1a;问题引入 可以看到我们在类UserInfo上写了Data注解&#xff0c;但是在测试文件中生成的反编译target文件Us二Info中没有get和set方法 二&#xff1a;解决方法 1&#xff1a;Spring升级问题&#xff08;解决了我的问题&#xff09; 原因是Spring官方进行了升级…

Unity 基于Collider 组件在3D 物体表面放置3D 物体

实现 从鼠标点击的屏幕位置发送射线&#xff0c;以射线监测点击到的物体&#xff0c;根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…

宝塔内设置redis后,项目以及RedisDesktopManager客户端连接不上!

项目展现问题&#xff1a; Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to xxx.宝塔外链.ip.xxxx:6379 redis客户端连接失败&#xff1a; 1、宝塔中确认redis端口已放行 2、修改redis的配置 bind&#x…

2024 年 11 月区块链游戏研报:牛市加持下的 GameFi 破局之路

2024 年 11 月区块链游戏研报 作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;Footprint Analytics 区块链游戏 Research 页面 2024 年 11 月 Web3 游戏行业市场增长显著但大规模采用策略仍在演进。随着比特币创下历史新高并接近 10 万美元里程碑…

[软件工程]十.可靠性工程(reliable engineering)

1.什么是可靠性工程 我们希望软件在给定的时间内&#xff0c;运行的时候不会崩溃或者发生失效&#xff0c;同时能保护我们的数据和个人信息。我们要能够信任我们所使用的软件&#xff0c;这意味着软件必须是可靠的。可靠性&#xff08;reliability&#xff09;&#xff1a;系统…

学生信息管理系统(简化版)

前端部分&#xff08;vue2&#xff09; &#xff01;&#xff01;前端采用vue2框架&#xff0c;下面只写出必要的代码文件&#xff0c;想要使用需自行先创建vue项目 部分截图 下面是目录结构 下面是public文件夹里面的html文件 <!DOCTYPE html> <html lang"&q…

Facebook广告文案流量秘诀

Facebook 广告文案是制作有效 Facebook 广告的关键方面。它侧重于伴随广告视觉元素的文本内容。今天我们的博客将深入探讨成功的 Facebook 广告文案的秘密&#xff01; 一、广告文案怎么写&#xff1f; 正文&#xff1a;这是帖子的正文&#xff0c;出现在您姓名的正下方。它可…

VBA高级应用30例应用在Excel中的ListObject对象:向表中添加注释

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

create-react-app react19 搭建项目报错

报错截图 此时运行会报错&#xff1a; 解决方法&#xff1a; 1.根据提示安装依赖法 执行npm i web-vitals然后重新允许 2.删除文件法 在index.js中删除对报错文件的引入&#xff0c;删除报错文件

【MySQL 进阶之路】事务并发情况分析

MySQL事务并发控制分析笔记 在数据库系统中&#xff0c;事务并发控制至关重要&#xff0c;能够确保多个事务并发执行时的数据一致性、隔离性和正确性。MySQL通过不同的锁机制控制并发操作&#xff0c;以确保事务的隔离性。以下是对事务A和事务B并发行为的详细分析&#xff0c;…

NanoLog起步笔记-6-StaticLogInfo

nonolog起步笔记-6-StaticLogInfo StaticLogInfo文件名和行号文件名和行号的传入log参数 RuntimeLogger::registerInvocationSitelogid为什么只能被赋一次值 reserveAlloc加入消息头finishAlloc返回 StaticLogInfo 写C语言编译前端时&#xff0c;给我印象深刻的一部分是&#…

不是“我应该做什么”,而是“我想做什么”

1. 识别内心的渴望 首先&#xff0c;我们需要识别自己真正的愿望和激情所在。这可能需要一些时间和自我反思。问自己&#xff1a;在没有任何外界压力的情况下&#xff0c;我真正想做的是什么&#xff1f;是赚钱、生活、旅行、追星&#xff0c;还是其他什么&#xff1f;识别这些…