Android Studio实现外卖订餐系统

article/2025/8/5 4:02:23

项目目录

  • 一、项目概述
  • 二、使用技术
  • 三、开发环境
  • 四、详细设计
    • 4.1 工程结构
    • 4.2 数据库设计
    • 4.3 首页
    • 4.4 购物车
    • 4.5 我的
    • 4.6 滑动菜单
  • 五、运行演示
  • 六、项目总结
  • 七、源码获取

一、项目概述

随着人们生活节奏的加快,生活质量的普遍提高,足不出户享受美食的需求日益增长。在此背景下,订餐系统应运而生,即方便了商家,也方便了用户。本项目应用Google界面设计语言Material Design来设计UI,也就是按照Android5.0之后所有内置应用的界面风格来进行设计。

用户打开应用后会进入欢迎界面,然后进行注册登录,主界面有3个底部导航栏:首页、购物车和我的。首先展示所有美食列表,点进去是美食详情页,然后是可折叠式标题栏,可以进行添加购物车,多次点击会增加数量。然后购物车显示添加的商品列表,长按删除商品,点击提交订单后下拉刷新即可。我的里面可以侧滑菜单查看个人信息,可以查看订单信息,并长按删除订单,还可以通过其他应用分享软件。

二、使用技术

除了必备的SQLite数据库和基础的布局控件外,着重介绍Material Design的UI设计,它是由谷歌的设计工程师们基于传统优秀的设计原则,结合丰富的创意和科学技术所发明的一套全新的界面设计语言,包含了视觉、运动、互动效果等特性。Material Design的出现,使得Android首次在UI方面超越了iOS。这个库已经在2015年时就推出了,我们应该对这些控件非常熟悉了。
包含但不限于Toolbar工具栏、DrawerLayout滑动菜单、NavigationView菜单导航栏、FloatingActionButton悬浮按钮、Snackbar反馈提示、CoordinatorLayout。

三、开发环境

开发环境依旧是在4.2.1上进行开发的,只要你的AS是近两年从官网下载的,都是可以满足的。

在这里插入图片描述

四、详细设计

4.1 工程结构

  • Activity包中是所有的Activity,包含欢迎、注册和登录等活动。
  • Adapter包中是Food、Cart和Order三个实体类的适配器,将数据源按照我们设置的子项布局来显示到列表中。
  • Bean包中是User、Food、Cart和Order四个实体类,包含成员属性、成员函数和构造函数。
  • Database包中是数据库访问类,DataBaseHelper包含建库和建表语句,其他的类都是每张表的CURD操作的封装。
  • Fragment包就是三个页面的碎片,首页、购物车和我的。

在这里插入图片描述

4.2 数据库设计

DataBaseHelper类就是我们的数据库,定义了数据库名称为ordersystem.db,版本号为1,然后定义了建表语句,分别是用户表User,购物车表Cart,订单表MyOrder。在onCreate中执行这些建表语句,就可以插入这三张表了。 最后onUpgrade,是在表进行变化时执行重新插入,只需改变版本号即可。DataBaseHelper完整代码如下:

// 数据库访问类
public class DataBaseHelper extends SQLiteOpenHelper {// 数据库名称public static final String DATABASE = "ordersystem.db";// 数据库版本号public static final int VERSION = 1;// 创建用户表Userpublic static final String CREATE_USER = "create table User ("+ "account text primary key,"+ "password text)";// 创建购物车表Cartpublic static final String CREATE_CART = "create table Cart ("+ "name text primary key,"+ "imageId integer,"+ "price text,"+ "num integer)";// 创建订单表MyOrderpublic static final String CREATE_ORDER = "create table MyOrder ("+ "id integer primary key,"+ "time text,"+ "price text,"+ "content text)";// 创建DB对象时的构造函数public DataBaseHelper(Context context) {super(context, DATABASE, null, VERSION);}// 创建数据库@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_USER);db.execSQL(CREATE_CART);db.execSQL(CREATE_ORDER);}// 升级数据库@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("drop table if exists User");db.execSQL("drop table if exists Cart");db.execSQL("drop table if exists MyOrder");onCreate(db);}
}

4.3 首页

首页的layout设计很简单,最外层是加强版FrameLayout,只包含一个SwipeRefreshLayout下拉刷新布局,然后嵌套一个RecyclerView滚动控件,大功告成。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"><androidx.swiperefreshlayout.widget.SwipeRefreshLayoutandroid:id="@+id/swipe_refresh"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/></androidx.swiperefreshlayout.widget.SwipeRefreshLayout></androidx.coordinatorlayout.widget.CoordinatorLayout>

java文件其实就是展示列表:1、创建数据源 2、创建适配器,同时加载数据源 3、设置适配器。
然后给下拉刷新布局设置个监听器,然后通知适配器更新数据源。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_home, container, false);// 创建数据源initFoods();RecyclerView recyclerView = view.findViewById(R.id.recycler_view);GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2);recyclerView.setLayoutManager(gridLayoutManager);// 创建适配器,同时加载数据源foodAdapter = new FoodAdapter(foodList);// 设置适配器recyclerView.setAdapter(foodAdapter);swipeRefresh = view.findViewById(R.id.swipe_refresh);swipeRefresh.setColorSchemeResources(R.color.design_default_color_primary);swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {refreshFoods();}});return view;}

4.4 购物车

购物车的layout也非常简单,需要注意每个布局/控件的layout_width和layout_height属性。
最外层CoordinatorLayout ,真的太好用了,强烈推荐!和首页布局唯一不同的就是里面还包了一个FloatingActionButton悬浮按钮。

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|end"android:layout_marginBottom="80dp"android:layout_marginRight="30dp"android:src="@mipmap/nav_task"app:maxImageSize="50dp"android:backgroundTint="@color/Azure"android:elevation="8dp"/><androidx.swiperefreshlayout.widget.SwipeRefreshLayoutandroid:id="@+id/swipe_refresh"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="wrap_content"android:layout_height="wrap_content"/></androidx.swiperefreshlayout.widget.SwipeRefreshLayout></androidx.coordinatorlayout.widget.CoordinatorLayout>

java文件其实就是获取控件实例,然后设置监听器,这里我们就展示悬浮按钮的监听器吧,复习下AlertDialog的标准用法,作为模板。

 // 订单提交fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {AlertDialog alertDialog = new AlertDialog.Builder(view.getContext()).setTitle("提示").setIcon(R.drawable.ic_order).setMessage("您确定要提交订单吗?").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {cartDao.openDB();cartDao.commitOrder();cartDao.clearCart();cartDao.closeDB();Toast.makeText(getContext(), "下单成功!请下拉刷新页面~", Toast.LENGTH_SHORT).show();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(getContext(), "订单已取消", Toast.LENGTH_SHORT).show();}}).show();}});

4.5 我的

布局就很中规中矩了,最常见的布局和控件,不再赘述了,只要花时间都能设计好的布局。

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/Azure"android:orientation="vertical"><de.hdodenhof.circleimageview.CircleImageViewandroid:id="@+id/circle_image"android:layout_width="100dp"android:layout_height="100dp"android:layout_gravity="center_horizontal"android:layout_marginTop="20dp"app:civ_border_width="2dp"android:src="@mipmap/nav_icon"app:civ_border_color="@color/CadetBlue"android:layout_marginBottom="20dp"/><ImageViewandroid:layout_width="match_parent"android:layout_height="80dp"android:background="@drawable/ic_chihuo"/><Viewstyle="@style/PersonLineStyle"android:layout_marginTop="10dp"android:background="@color/white"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/LightCyan"><ImageViewstyle="@style/PersonImageStyle"android:src="@drawable/ic_person"/><TextViewandroid:id="@+id/person"style="@style/PersonTvStyle"android:text="@string/person" /></LinearLayout><Viewstyle="@style/PersonLineStyle"android:background="@color/white"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/LightCyan"><ImageViewstyle="@style/PersonImageStyle"android:src="@drawable/ic_order"/><TextViewandroid:id="@+id/order"style="@style/PersonTvStyle"android:text="@string/order" /></LinearLayout><Viewstyle="@style/PersonLineStyle"android:background="@color/white"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/LightCyan"><ImageViewstyle="@style/PersonImageStyle"android:src="@drawable/ic_share"/><TextViewandroid:id="@+id/share"style="@style/PersonTvStyle"android:text="@string/share" /></LinearLayout><Viewstyle="@style/PersonLineStyle"android:background="@color/white"/><androidx.cardview.widget.CardViewandroid:layout_width="match_parent"android:layout_height="wrap_content"app:cardCornerRadius="6dp"android:elevation="5dp"><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/ic_more"/></androidx.cardview.widget.CardView></LinearLayout>

java代码就是获取控件实例,然后绑定监听器,最后展示下滑动菜单栏选中事件的监听器,也就是关闭侧滑菜单。

  // 菜单项选中事件的监听器navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(MenuItem item) {drawerLayout.closeDrawers();return true;}});

4.6 滑动菜单

NavigationView是Design Support中提供的一个控件,使得滑动菜单界面的实现变得非常简单。NavigationView使用之前,还需要准备两个东西:menu和headerLayout,menu是用来在NavigationView中显示具体菜单项的,headerLayout则是用来在NavigationView中显示头部布局的。

res/menu/nav_menu.xml 就是具体的菜单项,< menu >标签中嵌套一个< group >标签,group表示一个组,checkableBehavior指定为single表示组中所有菜单项只能单选。然后定义五个< item >,使用id属性指定菜单项的id,icon指定菜单项的图标,title指定菜单项显示的文字,就是这么简单。

在这里插入图片描述

layout/nav_header 中就是头部布局,我们这里简单起见,只放置了头像、用户名和邮箱地址这三项内容,这里就用到了CircleImageView对头像进行圆形化。

在这里插入图片描述

五、运行演示

用AS打开项目,进行构建,Build成功后,打开AVD运行项目,因为本项目包含动画效果,所以通过视频展示效果最佳。

Android Studio实现订餐系统

六、项目总结

本次订餐系统,不同于以往任何项目,历史性地使用了Material Design来设计UI,drawable图标多达三十个,colors颜色使用了数十种,themes中定义了系统的主题,styles中定义了基础控件的属性。有九个功能页面,每一处点击都与数据库进行交互,可以说代码的健壮性已经经过多次测试,很鲁棒。每一处细节也尽量做到位,耗时25h打造。希望大家能从中学到Material Design的UI设计的风格。

七、源码获取

♻️下面两种方式都可以获取源代码
1️⃣ 点击直接下载 Android Studio 订餐系统
2️⃣关注公众号《 萌新加油站 》,后台回复: 订餐

🚀这有你错过的精彩内容
Android Studio实现饮食搭配系统
Android Studio实现考试管理系统
Android Studio实现天气预报系统
Android Studio实现图书馆订座系统
Android Studio实现前后台分离的选课系统

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼


http://chatgpt.dhexx.cn/article/MAWKuenT.shtml

相关文章

Android程序的目录结构

Android程序的目录结构 Android的项目的目录结构&#xff0c;在开始设计程序时&#xff0c;可能感觉不到有多大的用处&#xff0c; 但是随着开发的深入&#xff0c;会涉及到各种类型的文件&#xff0c;项目的目录结构就非常重要了&#xff0c; 你不能把文件乱放&#xff0c…

Android App 架构设计

简介 本文是对谷歌原生文档的翻译&#xff0c;仅供学习参照。 原文链接 此文档写给希望学习最优编程实践和架构以开发健壮、高质量APP的开发者。 开发者常遇到的问题 传统的桌面程序大多数使用场景是有一个启动入口&#xff0c;作为一个独立进程运行。Android app结构要复…

Android 程序框架设计

这篇文章主要内容来自于之前我讲的一个PPT文档&#xff0c;现在将其整理如下。欢迎指正。以下的内容都是来自于我自身的经验&#xff0c;欢迎大家多提自己的建议。 1、一些概念 模式的定义&#xff1a; 每个模式都描述了一个在我们的环境中不断出现的问题&#xff0c;然后描述…

3、Android项目结构分析

Android项目结构分析 文章目录 Android项目结构分析一、文件系统结构1、项目配置清单文件夹 manifests2、源程序文件夹Java3、资源程序文件夹res①布局文件夹res/layout②值文件夹res/values③软件设计的国际化④图像文件夹res/drawable⑤声音文件夹res/raw 二、创建多模块三、…

Android | 序列化Serializable/Parcelable 使用总结

本文已同步发表于我的微信公众号&#xff0c;搜索 代码说 即可关注&#xff0c;欢迎与我沟通交流。 文章目录 一、什么是序列化&#xff1f;为什么要序列化&#xff1f;怎么进行序列化&#xff1f;二、Serializable2.1 序列化举例2.2 重写readObject、writeObject、readResolve…

Android应用程序设计——入门配置

第一章:Android简介与项目部署 版权声明: 本文为博主学习整理原创文章,如有不正之处请多多指教。 未经博主允许不得转载。https://mp.csdn.net/postedit/81837814 Android由来Android又称“机器人”,版权归google公司所有。是Google于2007年11月5日宣布的基于Linux平台的…

Android程序设计基础 • 【第1章 Android程序入门】

全部章节 >>>> 本章目录 1.1 Android 平台介绍 1.1.1 Android 简介 1.1.2 Android 平台的发展 1.1.3 Android 平台架构 1.2 搭建 Android 开发环境 1.2.1 下载和配置 Android Studio 1.2.2 初始化配置 Android Studio 1.2.3 配置和使用 Genymotion 模拟器…

Android自动化的一般方法

1 背景 https://mp.weixin.qq.com/s/B7o3JSkYI_9c4RivatsZKQ Android自动化包含自动化测试和第三方App的自动化运行&#xff0c;这里的自动化测试主要指的是纯粹的黑盒测试&#xff0c;即在完全不了解代码逻辑的情况下编写的测试用例&#xff0c;可以代替人工完成重复性的工…

基于Android的点餐系统设计与实现

目 录 摘 要 2 ABSTRACT 3 目 录 1 1 绪 论 1 1.1课题研究背景和意义 1 1.2课题可行性分析 2 1.3论文框架安排 3 2 开发语言说明 4 2.1 开发工具及环境简介 4 2.2 Android系统 5 2.2.1 Android Features特性 5 2.2.2 Android系统的四大组件 6 3 点餐系统分析 8 3.1概述 8 3.1.1…

基于Android的记账本的设计与实现

1.基于Android平台的记账系统概述 记账就是按照生活中的发生的经济活动&#xff0c;及时进行记录&#xff0c;为了便于分析个人消费和各种财务状况等等&#xff0c;通过您的随身会计——记账本APP更易看出资金的流动方向。 本论文采用的是一种可移动的记账方法&#xff0c;由移…

Android设计模式之——模板方法模式

一、介绍 在面向对象开发过程中&#xff0c;通常会遇到这样的一个问题&#xff0c;我们知道一个算法所需的关键步骤&#xff0c;并确定了这些步骤的执行顺序&#xff0c;但是&#xff0c;某些步骤的具体实现是未知的&#xff0c;或者说某些步骤的实现是会随着环境的变化而改变…

Android程序设计基础

#Android应用程序架构 Android程序的入口被称为Main Activity&#xff0c;带有界面的Android应用程序一般需要从Main Activity启动。 目录结构 Adnroid工程主要包括两个区域&#xff1a;源码区和资源区。 Mainifest.xml 下面是一个标准的AndroidManifest.xml文件样例。 <…

qt如何编写android程序,如何利用Qt开发Android应用程序

Qt 工具箱是一个使用广泛的跨平台GUI工具箱,可用于 Windows、Linux、Mac OSX 和许多手持平台。QT 具有良好结构化(但灵活)的面向对象的结构、清晰的文档以及直观的 API。 Qt最大的优势就是跨平台,一次性开发的Qt应用程序,可以跑Windows、跑linux、跑MAC……如今移动平台Andr…

Android插件化方案实践

一、插件化概述 1、插件化和组件化的区别 组件化是将一个app拆分为多个模块进行协作开发&#xff0c;每个模块都是一个单独的组件&#xff0c;这些组件可以相互依赖&#xff0c;也可以单独调试运行。但是最终发布的时候&#xff0c;这些组件会合并在一起&#xff0c;组成一个整…

Android手机开发课程设计之记事本

一、需求分析 1.1业务需求分析 近年来&#xff0c;随着生活节奏的加快&#xff0c;工作和生活的双重压力全面侵袭着人们&#xff0c;如何避免忘记工作和生活中的诸多事情而造成不良的后果就显得非常重要。为此我们开发一款基于Android系统的简单记事本&#xff0c;其能够便携…

MATLAB图形绘制--添加图例

添加图例 专业的图像总是附有图例来告诉读者曲线表示什么&#xff0c;下面我们将绘制两个表示势能的函数&#xff0c;他们由双曲三角函数sinh(x)和cosh(x)来定义&#xff0c;X的定义域为0&#xff5e;2&#xff0c;首先我们定义X&#xff1a; >> x [0:0.01:2];然后表示…

matlab 图例自定义,matlab中如何自定义图例_常见问题解析

pd接口是什么口_常见问题解析 pd接口也是“Type-C”的接口&#xff0c;支持扩充协议&#xff0c;可以给手机笔记本充电&#xff0c;也可以传输数据&#xff1b;而“Type-C”中的PD的意思指的是“USB Power Delivery”功率传输协议。 matlab中如何自定义图例&#xff1f;Matlab如…

Matlab 画多个图例( Plot multiple legends )

用matlab 画图时&#xff0c;发现线太多&#xff0c;生成的图例&#xff0c;遮盖了曲线。于是想画成多个图例&#xff0c;然后可以自由拖动。 废话不多说&#xff0c;2&#xff09;代码&#xff08;设置多个图例的部分在最后20行&#xff09;&#xff1b; 1&#xff09;效果。 …

matlab之图例legend的数字变量显示

legend是matlab的图例使用函数&#xff0c;其主要的只用方式为legend(内容1,内容2) 本文主要介绍一下legend如何引用数组的数字表现形式。 例如&#xff0c;若想要画一个滤波器的不同反馈系数的频率响应曲线&#xff0c;在设置条例内容时&#xff0c;需要手动输入反馈系数K的数…

MATLAB图例变成一列变多列的方法

小编在绘制GPS数据图像时&#xff0c;发现图例中元素个数有31个&#xff0c;当采用默认生成图例时&#xff0c;只有一列图例&#xff0c;显示结果如下 图例非常难看&#xff0c;而且占位子&#xff0c;如何让图例从一列变成多列呢&#xff1f; 这里小编给大家提供一个思路&…