安卓(android)订餐菜单【Android移动开发基础案例教程(第2版)黑马程序员】
一、实验目的(如果代码有错漏,可查看源码)
1.掌握Activity生命周的每个方法。
2.掌握Activity的创建、配置、启动和关闭。
3.掌握Intent和IntentFilter的使用。
4.掌握Activity之间的跳转方式、任务栈和四种启动模式。
5.掌握在Activity中添加和使用Fragment。
二、实验条件
1.熟悉Java编程语言;了解Android应用程序的基本结构;掌握XML布局文件的编写;了解Activity和Fragment的基本概念。
2.其他准备:准备好菜单项的图片资源;设计好菜单的数据结构和内容。
三、实验内容
1.搭建菜单界面布局:搭建左侧菜单栏界面布局;搭建右侧菜单列表界面布局;搭建菜单列表界面的条目布局。
2.实现菜单界面功能:封装菜品信息的实体类;加载左侧菜单栏界面布局;编写菜单列表的适配器;加载右侧菜单栏界面布局;实现显示菜单的效果。
3.运行程序:运行程序,显示推荐选项的界面效果;点击“进店必买选项”,显示其对应的界面效果。



4实验过程使用的图片如下:







四、实验指导
1.搭建菜单界面布局
(1)订单菜单界面主要包含三部分:顶部导航栏、左侧菜单栏和右侧菜单列表。搭建界面布局的步骤:
①创建项目程序,导入图片资源素材;
②在res→values目录下创建colors.xml文件,添加颜色定义代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources><color name="purple_200">#FFBB86FC</color><color name="purple_500">#FF6200EE</color><color name="purple_700">#FF3700B3</color><color name="teal_200">#FF03DAC5</color><color name="teal_700">#FF018786</color><color name="black">#FF000000</color><color name="white">#FFFFFFFF</color><color name="dark_gray">#626262</color><color name="gray">#f7f8f9</color></resources>
③在res→values目录下创建styles.xml文件,定义文本样式代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources><style name="tvNavigationBarStyles"><item name="android:layout_width">wrap_content</item><item name="android:layout_height">wrap_content</item><item name="android:layout_marginLeft">25dp</item><item name="android:layout_marginTop">4dp</item><item name="android:textSize">16sp</item></style><style name="tvleftStyles"><item name="android:layout_width">100dp</item><item name="android:layout_height">40dp</item><item name="android:gravity">center</item><item name="android:textColor">@color/dark_gray</item><item name="android:textSize">16sp</item></style></resources>
④在res→layout目录下,在activity_main.xml中添加界面控件;创建left_layout.xml完成搭建左侧菜单栏布局;创建right_layout.xml文件搭建右侧菜单栏布局;创建list_item.xml完成创建listview的条目布局界面,并修改默认标题栏。

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"android:orientation="vertical"tools:context=".MainActivity"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:layout_marginBottom="4dp"android:gravity="center_vertical"><TextViewandroid:id="@+id/tv_order"style="@style/tvNavigationBarStyles"android:textColor="@color/black"android:text="点菜"/><TextViewandroid:id="@+id/tv_discuss"android:layout_toRightOf="@id/tv_order"style="@style/tvNavigationBarStyles"android:textColor="@color/dark_gray"android:text="评价"/><TextViewandroid:id="@+id/tv_business"style="@style/tvNavigationBarStyles"android:textColor="@color/black"android:layout_toRightOf="@id/tv_discuss"android:text="商家"/><TextViewandroid:layout_width="70dp"android:layout_height="30dp"android:textSize="12sp"android:layout_alignParentRight="true"android:layout_marginRight="15dp"android:background="@drawable/left"android:gravity="center"android:textColor="#ef842c"android:text="好友拼单"/></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><fragmentandroid:id="@+id/left"android:name="cn.itcast.menu.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"tools:layout="@layout/left_layout"/><fragmentandroid:id="@+id/right"android:name="cn.itcast.menu.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3"tools:layout="@layout/right_layout"/></LinearLayout>
</LinearLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"android:padding="5dp"><ImageViewandroid:id="@+id/iv_img"android:layout_width="70dp"android:layout_height="70dp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="8dp"android:layout_marginRight="8dp"android:orientation="vertical"><TextViewandroid:textSize="14sp"android:padding="2dp"android:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#868788"android:id="@+id/tv_sale"android:textSize="12sp"/><TextViewandroid:id="@+id/tv_price"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:textSize="12sp"/></LinearLayout></LinearLayout>
left_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tv_recommend"style="@style/tvleftStyles"android:background="@color/white"android:text="推荐" /><TextViewandroid:id="@+id/tv_must_buy"style="@style/tvleftStyles"android:text="进店必买"/></LinearLayout>
right_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/lv_list"android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="@null"/></LinearLayout>
2.实现菜单界面功能
(1)封装菜品信息实体类FoodBean:
package cn.itcast.menu;public class FoodBean {private static final long serialVersionUID=1L;private String name;private String sales;private String price;private int img;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSales() {return sales;}public void setSales(String sales) {this.sales = sales;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}public int getImg() {return img;}public void setImg(int img) {this.img = img;}}
(2)加载左侧菜单栏界面布局,在LeftFragment.java中代码实现如下:
package cn.itcast.menu;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
public class LeftFragment extends Fragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view =inflater.inflate(R.layout.left_layout,container,false);return view;}@Overridepublic void onPause() {super.onPause();}
}
(3)通过ListView实现菜单列表,编写其对应的适配器RightAdapter.java。
package cn.itcast.menu;import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;public class RightAdapter extends BaseAdapter {private Context mContext;private List<FoodBean> list;public RightAdapter(Context context , List<FoodBean>list){this.mContext=context;this.list=list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder=null;if(convertView==null){convertView=View.inflate(mContext,R.layout.list_item,null);holder= new ViewHolder();holder.tv_name=convertView.findViewById(R.id.tv_name);holder.tv_sale=convertView.findViewById(R.id.tv_sale);holder.tv_price=convertView.findViewById(R.id.tv_price);holder.iv_img=convertView.findViewById(R.id.iv_img);convertView.setTag(holder);}else {holder=(ViewHolder) convertView.getTag();}FoodBean bean=list.get(position);holder.tv_name.setText(bean.getName());holder.tv_sale.setText(bean.getSales());holder.tv_price.setText(bean.getPrice());holder.iv_img.setBackgroundResource(bean.getImg());return convertView;}class ViewHolder{TextView tv_name,tv_sale,tv_price;ImageView iv_img;}
}
(4)创建右侧Fragment来显示菜单栏列表信息,具体实现代码如下:
package cn.itcast.menu;import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import java.io.Serializable;
import java.util.List;public class RightFragment extends Fragment {private ListView lv_list;public RightFragment() {}public RightFragment getInstance(List<FoodBean> list) {RightFragment rightFragment = new RightFragment();Bundle bundle = new Bundle();bundle.putSerializable("list", (Serializable) list);rightFragment.setArguments(bundle);return rightFragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.right_layout, container, false);lv_list = view.findViewById(R.id.lv_list);if (getArguments() != null) {List<FoodBean> list = (List<FoodBean>) getArguments().getSerializable("list");RightAdapter adapter = new RightAdapter(getActivity(), list);lv_list.setAdapter(adapter);}return view;}
}
(5)实现显示菜单的效果,在MainActivity.java中定义init()方法、setData()方法、clickEvent()方法和switchData()方法,分别实现初始化界面控件、实现界面控件点击事件和切换右侧菜单列表数据的功能,代码如下:
package cn.itcast.menu;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction;
import android.app.Fragment;
import android.app.FragmentManager;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MainActivity extends AppCompatActivity {private FragmentManager fragmentManager;private FragmentTransaction fragmentTransaction;private Fragment leftFragment;private RightFragment rightFragment;private TextView tv_recommed,tv_must_buy;private String[]names1={"爆款*肥牛鱼豆腐骨肉相连三荤五素一份米饭","豪华双人套餐","【热销】双人套餐(含两份米饭)"};private String[]sales1={"月售520 好评度80%","月售520 好评度80%","月售520 好评度80%"};private String[]prices1={"$23","$41","$32"};private int []imgs1={R.drawable.food1,R.drawable.food2,R.drawable.food3};private String[]names2={"鸿运当头-油焖大虾","金肥牛跃龙门","香甜菠萝咕噜肉"};private String[]sales2={"月售1314 好评度90%","月售999 好评度85%","月售520 好评度80%"};private String[]prices2={"$36","$45","$29"};private int []imgs2={R.drawable.foodd1,R.drawable.foodd2,R.drawable.foodd3};private Map<String, List<FoodBean>> map;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setData();init();clickEvent();}private void init(){//给主页面左侧的fragment界面控件赋值fragmentManager = getFragmentManager();leftFragment=fragmentManager.findFragmentById(R.id.left);tv_recommed=findViewById(R.id.tv_recommend);tv_must_buy=findViewById(R.id.tv_must_buy);}private void setData(){//给数据赋值将其全部放在对应的数据集里map=new HashMap<>();List<FoodBean>list1=new ArrayList<>();List<FoodBean>list2=new ArrayList<>();for(int i=0;i<names1.length;i++){FoodBean bean=new FoodBean();bean.setName(names1[i]);bean.setPrice(prices1[i]);bean.setImg(imgs1[i]);bean.setSales(sales1[i]);list1.add(bean);}map.put("1",list1);for(int i=0;i<names2.length;i++){FoodBean bean=new FoodBean();bean.setName(names2[i]);bean.setPrice(prices2[i]);bean.setImg(imgs2[i]);bean.setSales(sales2[i]);list2.add(bean);}map.put("2",list2);}private void clickEvent(){//点击推荐还在必须控件变化颜色,可以增加可适度tv_recommed.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {switchData (map.get("1"));tv_recommed.setBackgroundColor(Color.WHITE);}});tv_must_buy.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {switchData (map.get("2"));tv_must_buy.setBackgroundColor(Color.WHITE);}});switchData (map.get("1"));}public void switchData(List<FoodBean> list){rightFragment=new RightFragment().getInstance(list);//实例fragmentfragmentManager=getFragmentManager();//获取FragmentManagerfragmentTransaction=getSupportFragmentManager().beginTransaction();//开启事务fragmentTransaction.replace(R.id.right,rightFragment);//添加一个FragmentfragmentTransaction.commit();//提交事务}}
五、代码下载地址:
android: 实现注册界面、实现注册界面、饭堂小广播、音乐播放器、记事本、读取手机通讯录、学生管理系统 - Gitee.com
相关文章:
安卓(android)订餐菜单【Android移动开发基础案例教程(第2版)黑马程序员】
一、实验目的(如果代码有错漏,可查看源码) 1.掌握Activity生命周的每个方法。 2.掌握Activity的创建、配置、启动和关闭。 3.掌握Intent和IntentFilter的使用。 4.掌握Activity之间的跳转方式、任务栈和四种启动模式。 5.掌握在Activity中添加…...
【cocos creator】【模拟经营】餐厅经营demo
下载:【cocos creator】模拟经营餐厅经营...
前端 | 深入理解Promise
1. 引言 JavaScript 是一种单线程语言,这意味着它一次仅能执行一个任务。为了处理异步操作,JavaScript 提供了回调函数,但是随着项目处理并发任务的增加,回调地狱 (Callback Hell) 使异步代码很难维护。为此,ES6带来了…...
Visual Studio Code修改terminal字体
个人博客地址:Visual Studio Code修改terminal字体 | 一张假钞的真实世界 默认打开中断后字体显示如下: 打开设置,搜索配置项terminal.integrated.fontFamily,修改配置为monospace。修改后效果如下:...
自然语言处理-词嵌入 (Word Embeddings)
人工智能例子汇总:AI常见的算法和例子-CSDN博客 词嵌入(Word Embedding)是一种将单词或短语映射到高维向量空间的技术,使其能够以数学方式表示单词之间的关系。词嵌入能够捕捉语义信息,使得相似的词在向量空间中具有…...
自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import precision_score, recall_score, f1_score# 数据准备 class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4,…...
【论文笔记】Fast3R:前向并行muti-view重建方法
众所周知,DUSt3R只适合做稀疏视角重建,与sapnn3r的目的类似,这篇文章以并行的方法,扩展了DUSt3R在多视图重建中的能力。 abstract 多视角三维重建仍然是计算机视觉领域的核心挑战,尤其是在需要跨不同视角实现精确且可…...
谈谈你所了解的AR技术吧!
深入探讨 AR 技术的原理与应用 在科技飞速发展的今天,AR(增强现实)技术已经悄然改变了我们与周围世界互动的方式。你是否曾想象过如何能够通过手机屏幕与虚拟物体进行实时互动?在这篇文章中,我们将深入探讨AR技术的原…...
upload labs靶场
upload labs靶场 注意:本人关卡后面似乎相比正常的关卡少了一关,所以每次关卡名字都是1才可以和正常关卡在同一关 一.个人信息 个人名称:张嘉玮 二.解题情况 三.解题过程 题目:up load labs靶场 pass 1前后端 思路及解题:…...
搜索引擎友好:设计快速收录的网站架构
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/14.html 为了设计一个搜索引擎友好的网站架构,以实现快速收录,可以从以下几个方面入手: 一、清晰的目录结构与层级 合理划分内容:目录结构应…...
基于 oneM2M 标准的空气质量监测系统的互操作性
论文标题 英文标题: Interoperability of Air Quality Monitoring Systems through the oneM2M Standard 中文标题: 基于 oneM2M 标准的空气质量监测系统的互操作性 作者信息 Jonnar Danielle Diosana, Gabriel Angelo Limlingan, Danielle Bryan Sor…...
春晚舞台上的人形机器人:科技与文化的奇妙融合
文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望:科技与文化的更多可能结语 2025 年央视春晚的舞台,无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上,一场名为《秧BOT》的创意融合…...
零基础学习书生.浦语大模型-入门岛
第一关:Linux基础知识 Cursor连接服务器 使用Remote - SSH插件即可 注:46561:服务器端口号 运行指令 python hello_world.py端口映射 ssh -p 46561 rootssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyCheckingno …...
Gurobi基础语法之 addConstr, addConstrs, addQConstr, addMQConstr
在新版本的 Gurobi 中,向 addConstr 这个方法中传入一个 TempConstr 对象,在模型中就会根据这个对象生成一个约束。更重要的是:TempConstr 对象可以传给所有addConstr系列方法,所以下面先介绍 TempConstr 对象 TempConstr TempC…...
数据结构---图的遍历
图的遍历(Travering Graph):从图的某一顶点出发,访遍图中的其余顶点,且每个顶点仅被访问一次,图的遍历算法是各种图的操作的基础。 复杂性:图的任意顶点可能和其余的顶点相邻接,可能在访问了某个顶点后,沿某条路径搜索…...
Qwen 模型自动构建知识图谱,生成病例 + 评价指标优化策略
关于数据库和检索方式的选择 AI Medical Consultant for Visual Question Answering (VQA) 系统:更适合在前端使用向量数据库(如FAISS)结合关系型数据库来实现图像和文本的检索与存储。因为在 VQA 场景中,你需要对患者上传的图像或…...
.Net Web API 访问权限限定
看到一个代码是这样的: c# webapi 上 [Route("api/admin/file-service"), AuthorizeAdmin] AuthorizeAdmin 的定义是这样的 public class AuthorizeAdminAttribute : AuthorizeAttribute {public AuthorizeAdminAttribute(){Roles "admin"…...
项目架构调整,切换版本并发布到中央仓库
文章目录 0.完成运维篇maven发布到中央仓库的部分1.配置server到settings.xml2.配置gpg 1.架构调整1.sunrays-dependencies(统一管理依赖和配置)1.作为单独的模块2.填写发布到中央仓库的配置1.基础属性2.基本配置3.插件配置 3.完整的pom.xml 2.sunrays-f…...
考试知识点位运算
深入理解位运算 在C编程的世界里,位运算作为一种直接对二进制位进行操作的运算方式,虽然不像加减乘除等算术运算那样广为人知,却在许多关键领域发挥着至关重要的作用。从底层系统开发到高效算法设计,位运算都展现出其独特的魅力与…...
matlab快速入门(2)-- 数据处理与可视化
MATLAB的数据处理 1. 数据导入与导出 (1) 从文件读取数据 Excel 文件:data readtable(data.xlsx); % 读取为表格(Table)CSV 文件:data readtable(data.csv); % 自动处理表头和分隔符文本文件:data load(data.t…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
