为Android构建现代应用——主体结构

news2024/9/23 17:19:04

创建Screents和ViewModels

在前面的章节中,我们已经分析了OrderNow项目的理论概念和我们将赋予的组织。

在本章中,我们将开始实现初始结构和模板,这将联接每一个应用程序的部分。

首先将添加以下带有各自视图模型的主屏幕:

• 首页

• 产品列表

• 产品详情

• 购物车

添加元素的一个例子如下图所示:

Sreens 和 ViewModels

 我们将在应用程序中使用依赖管理器将每个ViewModel绑定到各自的屏幕上。为此,我们必须首先在应用程序中依赖Hilt。

implementation 'com.google.dagger:hilt-android:2.38.1' // Use the latest version
kapt 'com.google.dagger:hilt-android-compiler:2.38.1' // Use the latest version

在依赖Hilt的过程后,将要求定义应用类型类,例如在我们的示例项目中,将定义为OrderNowApplication,如下:

@HiltAndroidApp
class OrderNowApplication:Application() {
}

注意:在androidmanifest .xml中注册OrderNowApplication类

<application

android:name=".main.OrderNowApplication"

android:allowBackup="true"

...>

此外,我们将 Navigation Compose依赖到项目中,这将允许View(Composable)在导航期间获得其各自ViewModel的实例:

dependencies {

       implementation 'androidx.hilt:hilt-navigation-compose:1.0.0'

}

一旦在项目中正确地执行了前面的配置,我们就可以像这样将ViewModel注入View:

 Home ViewModel:

@HiltViewModel

class HomeViewModel @Inject constructor() : ViewModel() {

...

}

Home Screen:

@Composable

fun HomeScreen(viewModel: HomeViewModel = hiltViewModel()

) {

...

}

每个屏幕都将通过Hilt依赖管理器与其相应的ViewModel相关联。到目前为止,我们已经集成了以下架构组件:Compose、Navigation和ViewModel。

这是Jetpack工具的完美组合,在后面的章节中,我们将看到它在移动开发中的潜力。

UI模式:TopAppBar和BottomAppBar

通过Scaffold组件,我们可以在应用程序中实现两种在Material Design中最常见的UI模式:TopAppBar和BottomAppBar。

Scaffold是一个详细的视图(composable),它将允许我们以以下方式实现这些模式:

Scaffold:

Scaffold(

        topBar = {

                   TopAppBar { /* Top app bar content */ }

        },

        bottomBar = {

        BottomAppBar { /* Bottom app bar content */ }

        }

) { contentPadding -> 9 // Screen content

}

在代码片段中,我们定义了topBar,bottomBar,和(还未添加的)屏幕内容。

在Scaffold中,topBar和bottomBar部分是可选的;也就是说,可以省略其中一部分的定义。此外,在Scaffold中,我们可以声明两个更多的组件:

• scaffoldState

• snackbarHost

在下一章,我们将看到每个的用法。现在我们只定义topBar和bottomBar。 现在我们知道如何在我们的应用程序中包含这些UI模式,下一步就是创建代表TopAppBar和BottomAppBar的视图(Composables)。

我们将其组织在一个叫做patterns的目录中,并在其中添加了两个Views,OrderNowTopBar和OrderNowBottomBar,如下所示:

TopAppBar and BottomAppBar Composables:

 OrderNowTopBar

OrderNowTopBar的实现很简单。我们最初只需要以以下方式实现它:

@Composable

fun OrderNowTopBar() {

        TopAppBar(

                title = {

                Text(

                        text = stringResource(id = AppString.app_name),

                        textAlign = TextAlign.Center,

                        modifier = Modifier.fillMaxWidth()

                )

        },

        backgroundColor = MaterialTheme.colors.background,

        contentColor = contentColorFor(MaterialTheme.colors.background)

        )

}

之前的实现还不包含返回选项等元素;然而,在后面的章节中添加“Back”到TopAppBar中,它将包含这样一个使用状态策略的导航选项。

OrderNowBottomBar

OrderNowBottomBar的实现可以更精细一些,因为我们需要包括屏幕之间的导航。但是,我们将把实现细节留到下一章。

现在,我们将包含一个没有导航的静态定义。

@Composable
fun OrderNowBottomBar() {
    val selectedIndex = remember { mutableStateOf(0) }
    BottomNavigation(
        backgroundColor = MaterialTheme.colors.background,
        contentColor = contentColorFor(MaterialTheme.colors.background),
        elevation = 10.dp
    ) {
        BottomNavigationItem(icon = {
            Icon(imageVector = Icons.Default.Home, "")
        },
            label = { Text(text = "Home") },
            selected = (selectedIndex.value == 0),
            unselectedContentColor = Color.Gray,
            selectedContentColor = orange,
            onClick = {
                selectedIndex.value = 0
            })

        BottomNavigationItem(icon = {
            Icon(imageVector = Icons.Default.ShoppingCart, "")
        },
            label = { Text(text = "Cart") },
            selected = (selectedIndex.value == 1),
            unselectedContentColor = Color.Gray,
            selectedContentColor = orange,
            onClick = {
                selectedIndex.value = 1
            })
    }
}

在这个阶段,我们已经有了屏幕、视图模型和Scaffold的定义(其中包括OrderNowBottomBar和OrderNowTopBar)。

下一步是将所有的部分组合在一起,我们将在下一部分中做这个。

将所有元素整合在一起

第一项任务是创建一个名为main的目录。这个目录将是横向的,并将包含App的基类或结构。

在该目录中,我们放置Application类,移动MainActivity到那里,以及应用程序的主屏幕,我们将其命名为OrderNowScreen,如下图所示。

Main Components: 

现在我们修改MainActivity.kt类,以便它将登录屏幕加载到OrderNowScreen应用程序,如下所示:

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
	super.onCreate(savedInstanceState)
	    setContent {
	        OrderNowScreen()
	    }
	}
}

然后,在OrderNowScreen视图中,我们像这样定义应用程序的Scaffold:

@Composable
fun OrderNowScreen() {
    InitialSkeletonTheme {
        Surface(
            modifier = Modifier.fillMaxSize(),
            color = MaterialTheme.colors.background
        ) {
            Scaffold(
                topBar = { OrderNowTopBar() },
                bottomBar = { OrderNowBottomBar() }
            ) { contentPadding ->
                println(contentPadding)
            }
        }
    }
}

当您运行应用程序时,结果应该类似于以下图像:

总结

在本章中,我们已经构建了OrderNow项目的初始结构。

这里定义和实现的组件将是下一章继续讨论导航的基础。

随着我们阅读这些章节,我们将改进OrderNow的每个部分的实现,因此.我们的电子贸易将以最佳方式设计和实施。

源码:

class MainActivity4: ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent{
            OrderNowScreen()
        }
    }
}
@Preview
@Composable
fun OrderNowScreen() {
    MyTestTheme {
        Surface(modifier = Modifier.fillMaxSize(),color=MaterialTheme.colors.background){
            Scaffold(
                topBar = {OrderNowTopBar()},
                bottomBar={ OrderNowBottomBar()}
            ) {contentPadding ->
                println(contentPadding)
            }
        }
    }
}



@Preview
@Composable
fun OrderNowBottomBar(){
    val selectedIndex =remember{ mutableStateOf(0)}
    BottomNavigation(
        backgroundColor = MaterialTheme.colors.background,
        contentColor=contentColorFor(MaterialTheme.colors.background),
        elevation = 10.dp){

        BottomNavigationItem(
                icon = { Icon(imageVector = Icons.Default.Home,"") },
                label = { Text(text = "首页")},
                selected =(selectedIndex.value == 0) ,
                unselectedContentColor = Color.Gray,
                selectedContentColor = Color.Red,
                onClick = { selectedIndex.value = 0 })
        BottomNavigationItem(icon={Icon(imageVector = Icons.Default.Favorite,"")},
        label = {Text(text="热门")},
        selected = (selectedIndex.value== 1),
            unselectedContentColor =Color.Gray,
            selectedContentColor = Color.Red,
            onClick ={selectedIndex.value=1}
            )
        BottomNavigationItem(
            icon = { Icon(imageVector = Icons.Default.ShoppingCart,"") },
            label = { Text(text = "购物车")},
            selected =(selectedIndex.value == 2) ,
            unselectedContentColor = Color.Gray,
            selectedContentColor = Color.Red,
            onClick = { selectedIndex.value = 2 })
        BottomNavigationItem(icon={Icon(imageVector = Icons.Default.Person,"")},
            label = {Text(text="我的")},
            selected = (selectedIndex.value== 3),
            unselectedContentColor =Color.Gray,
            selectedContentColor = Color.Red,
            onClick ={selectedIndex.value=3}
        )
    }
}


@Composable
fun OrderNowTopBar() {
    TopAppBar(
        title = {
            Text(
                text = stringResource(id = R.string.app_name),
                textAlign = TextAlign.Center,
                modifier = Modifier.fillMaxWidth()
            )
        },
        backgroundColor = MaterialTheme.colors.background,
        contentColor = contentColorFor(MaterialTheme.colors.background)
    )
}





@HiltAndroidApp
class OrderNowApplication : Application() {
}

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

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

相关文章

到底什么是前后端分离

目录 Web 应用的开发主要有两种模式&#xff1a; 前后端不分离 前后端分离 总结 Web 应用的开发主要有两种模式&#xff1a; 前后端不分离 前后端分离 理解它们的区别有助于我们进行对应产品的测试工作。 前后端不分离 在早期&#xff0c;Web 应用开发主要采用前后端不…

“云上新气象”,VDI+IDV混合部署,麒麟信安云正式上线某市气象局!

阴晴冷暖&#xff0c;风云变幻&#xff0c;气象与人们的生活密切相关&#xff0c;气象局信息系统的智慧高效运营对于提升灾害防御能力、城市气象观测等方面具有重要作用&#xff0c;随着气象业务范围的不断扩展&#xff0c;气象局的信息化建设与数字化转型也亟需提上日程。 走…

【Solr】Solr搜索引擎使用

文章目录 一、什么是Solr?二 、数据库本身就支持搜索啊,干嘛还要搞个什么solr?三、如果我们想要使用solr那么首先我们得安装它 一、什么是Solr? 其实我们大多数人都使用过Solr,也许你不会相信我说的这句话,但是事实却是如此啊 ! 每当你想买自己喜欢的东东时,你可能会打开某…

Python入门准备

安装并配置Python 1、想要更新终端里Python的版本&#xff1a; 在python.org官网上下载最新版&#xff0c;下载安装以后&#xff0c;在终端输入python3进行询问。 2、完成Python环境的安装(Linux:操作系统&#xff0c;基于Cent0S7&#xff09; 在Linux系统上安装Python需要…

中小学分班查询系统如何制作?这个方法3分钟轻松搞定

暑假一过完&#xff0c;新学年即将开始&#xff0c;学校面临着一个重要的任务&#xff1a;学生分班。无论是新生入学还是低年级升高年级&#xff0c;都需要进行分班工作。这对负责分班的老师们来说&#xff0c;增加了相当大的工作量和挑战。 在开学前&#xff0c;如何快速搞定…

Pure Admin 图标篇

1. 官方图标讲解地址 B站搜索&#xff1a;vue-pre-admin之图标篇&#xff0c;作者“乐于分享的程序员小铭” 2. 实操 1. iconify官网 Icon Sets • Iconify 2. 在build->optimize.ts 中&#xff0c;配置所用的Iconify icon包 如&#xff1a; "iconify-icons/ep&quo…

LNK 2001 问题的一种解决办法

问题&#xff1a; 可能有这样的报错&#xff0c;error LNK 2001: 无法解析的外部符号" protected: virtual void __thiscall testing::Test::SetUp(void)"。 解决办法&#xff1a; 换了各编译器就好了&#xff0c;从第二个换到了第一个。 猜测&#xff1a;这里是因…

开江县“五社联动 关爱一老一小“主题活动之银龄爱齿健康关爱计划

为进一步宣传和推动“五社联动”关爱“一老一小”的社工服务理念&#xff0c;近日&#xff0c;开江县网格员社会工作服务中心携手彭州市葡萄树社会工作服务中心链接爱心单位&#xff08;夜郎古酒&#xff09;捐赠的1440支牙膏&#xff08;合和泰品牌牙膏&#xff09;&#xff0…

Electron从构建到打包程exe应用

Electron从构建到打包程exe应用 Electron文档搭建网页装载到 BrowserWindow中定义全局对象进程之间通信打包应用程序对代码进行签名 Electron文档 搭建 创建一个文件夹&#xff0c;在根目录执行以下几个命令 1.npm init 2.npm install electron --save-dev 3.根目录新增main…

route_group时调整routing rule via array大小

使用route_group secondary pg pin时需要multi via/double via&#xff0c;可以使用如下办法。 用create_routing_rule -vias {{via_def_name array_size NR/R} {xx xx xx}} R和NR就是能不能旋转 set_routing_rule net_name -rule rule_name -max_routing_layers MEx -max_la…

RHCSA(一)

1、在VMware上创建虚拟机以及安装Linux操作系统&#xff0c;使用ssh进行远程连接 1.创建虚拟机 2.安装Linux系统 3.使用Xshell进行远程ssh连接终端 进入了Linux系统&#xff0c;打开终端输入ifconfig回车得到了虚拟网卡的IP地址为192.168. 163.128 打开Xshell远程连接软件…

Longhorn vs Rook vs OpenEBS vs Portworx vs IOMesh:细说 5 款 K8s 持久化存储产品优劣势

云原生时代下&#xff0c;越来越多的企业开始使用 Kubernetes&#xff08;K8s&#xff09;承载数据库、消息中间件等“生产级”有状态工作负载。由于这些应用对数据持久保存、性能、容量扩展和快速交付具有较高的要求&#xff0c;企业往往需要采用专为 Kubernetes 环境设计的持…

入侵检测——IDS概述、签名技术

1. 什么是IDS&#xff1f; IDS&#xff08;intrusion detection system&#xff09;入侵检测系统&#xff0c;是一种对网络传输进行即时监视&#xff0c;在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。它会对系统的运行状态进行监视&#xff0c;发现各种攻击企…

力扣959. 由斜杠划分区域

题目描述&#xff1a; 在由 1 x 1 方格组成的 n x n 网格 grid 中&#xff0c;每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。 给定网格 grid 表示为一个字符串数组&#xff0c;返回 区域的数量 。 请注意&#xff0c;反斜杠字符是转义的&…

乐维监控 | 如何快速关闭网络设备所有端口

在运维监控实践中&#xff0c;由于不同的运维人员可能会关注不同的监控指标&#xff0c;因此乐维监控在监控网络设备时&#xff0c;会默认开启所有的端口&#xff0c;尽可能多的覆盖监控指标&#xff0c;避免遗漏重要指标。但是&#xff0c;这样又会带来新的问题&#xff0c;在…

ITIL4—服务管理的四个维度

服务管理的四个维度 上一章概述了对服务管理至关重要的概念。一个组织的目标是为其利益相关者创造价值&#xff0c;这是通过提供和消费服务来实现的。ITIL SVS描述了组织的各个组成部分协同工作创造该价值的方式。但是&#xff0c;在进一步探讨之前&#xff0c;必须首先介绍服…

嵌入式工程师有发展前途吗?

如果你是真的喜欢嵌入式&#xff0c;那鼓励你顺从内心指引。毕竟人生不仅仅是向钱看的。根据马斯洛需求模型&#xff0c;在物质条件基本满足后就会进而强调精神需求&#xff0c;当然现今消费主义社会&#xff0c;你可以选择砸钱下猛药感官刺激来安抚虚无的内心&#xff0c;但这…

麒麟信安携手航天紫光发布 “自主操作系统+国产数据库”联合解决方案

数据库是计算、存储和管理数据信息的重要“仓库”&#xff0c;国产操作系统则为各项业务系统的运行提供安全可靠的底座支撑&#xff0c;操作系统、数据库等基础软件实现自主可控&#xff0c;对于我国信息安全和数字经济发展具有重要意义。为满足当前各大行业用户海量数据高并发…

OBS直播如何实现竖屏直播(OBS配置竖屏直播)

OBS直播如何实现竖屏直播&#xff08;OBS配置竖屏直播&#xff09; 第1步&#xff1a;安装好OBS直播软件&#xff1b; 第2步&#xff1a;打开OBS&#xff0c;点击右下角“设置 --> 视频” 》配置 竖屏直播的分辨率&#xff0c;比如900x1600、1080x1920的分辨率&#xff1b;…

Vue2.0 使用 echarts

目录 1. 配置 渲染2. 数据渲染 1. 配置 渲染 安装 echarts 依赖 npm install echarts -Smain.js&#xff0c;引入 echarts import * as echarts from echarts// 在import的后面&#xff0c;echarts的前面加一个 * as Vue.prototype.$echarts echarts从 echarts 官网直接复制…