目录
1.背景介绍
2.需求分析
2.1待解决问题
2.2 解决方式
3.开发环境
3.1开发工具简介
3.2开发语言简介
4.功能介绍
5.程序实现及关键代码分析
5.1“添加食材”功能实现及分析
5.1.1基于本地数据库的数据持久化
5.1.2 界面设计
5.2“菜篮状况”功能实现及分析
5.2.1动态SQL语句分类查找
5.2.2 界面设计
5.3“菜篮状况”功能实现及分析
5.3.1简易数据分析实现
5.3.2界面设计
5.4“养生建议”功能实现及分析
5.4.1 站列表实现(WebView)
5.4.2 界面设计
5..5 “备忘记录”功能实现及分析
5.5.1 基于本地数据库的内嵌记事本实现
5.5.2 界面设计
5.6 “菜篮管理”功能实现及分析
5.6.1 菜篮数据库增删实现
5.6.2界面设计
5.7 “菜谱搜索”功能实现及代码分析
5.7.1 API接口调用与JSON数据解析
5.7.2 界面设计
5.8 “私人收藏”功能实现及代码分析
5.8.2 界面设计
1.背景介绍
健康是一种人在身体与精神上的完全统一的状态,根据世卫组织(WHO)的统计数据,中国居民中符合世卫组织对健康的定义的人数只占总人口的15%,并且有同等比例的人群处在疾病状态中,剩下近十分之七的人处在所谓“亚健康”状态。
后疫情时代,健康已成为当下热点话题之一,健康消费也正逐步渗透到更多的生活领域当中,与此同时,市场上关于生活与健康的APP数目也逐渐增多,包括keep等健身软件,今日养生等健康知识软件,果蔬百科等生活常识软件多种类型。
而健康饮食是指恰当选择搭配合理和适当份量的食物进行食用,人体摄入各种营养素和恰当热量去维持身体细胞的正常生长,增强身体对疾病的抵抗力和维持一定的体重。.
饮食健康因为与人们日常生活的息息相关,又格外被人们所重视,食材的新鲜程度,菜谱搭配合理与否,都是影响厨房能否高效运行,家人的饮食健康的关键因素。
2.需求分析
2.1待解决问题
后疫情时代,新冠疫情防控常态化关键时期,为响应政府 召,民众减少外出,居家抗疫;屯菜也成为不可避免的生活常态。
购菜数目的增长往往带来管理的混乱,列举如下:
- 一,在菜市场时,常常忘记家中还余哪些菜,担心买重(复)或是无法搭配而导致食材的闲置与浪费。
- 二,忽略了食材的购买时间,摄入了变质食材;又或是烹饪方法错误,将产生不良化学反应的食材进行了混合食用,造成恶性食物中毒事件。
- 三,在家时冰箱难以整理,偶尔将某些食材遗忘在冰箱角落,再找到时已然无法食用或是新鲜不再。
- 四,厨房中,发觉某类食材与其他食材间不能够进行有效搭配,又或是不知如何对其进行正确烹饪,造成不必要的浪费。
2.2 解决方式
为做好家庭食材的管理,借助Android移动端对购买食材信息进行记录,将已购的食材录入到移动端,便捷民众整理与记忆,做到购菜时心中有数(解决问题一/三),时刻关注到菜篮中食材的新鲜程度,包括照片间的比对,购入时间的记录等等(解决问题二)。
同时该APP提供了大量正确有效的烹饪方法,在使用过程中用户能够锻炼厨艺(解决问题四),提升生活质量,进行高品质饮食。
3.开发环境
该软件设计基于安卓(Android)进行开发,安卓(Android)是基于Linux内核基础的自由开放源代码的操作系统,适用于便捷携带的设备,如智能手持设备;随后在其发展的过程中不断扩展到其他领域中,例如平板电脑等。安卓(Android)由美国Google公司收购注资。
3.1开发工具简介
Android Studio 是美国Google公司推出的Android集成开发环境,整体架构与JetBrains旗下的IntelliJ IDEA类似,并提供了相似的开发调试工具。
3.2开发语言简介
Android采取代码与布局相分离的方式对项目进行组织,由Java语言编写内部的逻辑,XML语言修改调整布局界面。
Java:最为广泛使用的编程语言之一,也是Android开发的基础。
XML: 可扩展标记语言,标准通用标记语言的子集。
4.功能介绍
- 添加食材,用户录入其数据信息,并将照片保存从而将购买的食材录入“菜篮”。
- 菜篮空间,对食材进行分类展示。
- 菜篮状况,对当前菜篮空间进行数据分析,柱状图的直观展示与分类统计。
- 养生建议,推送一定健康小常识文章。
- 备忘记录,内嵌记事本,帮助记忆。
- 菜篮管理,对菜篮进行删查操作,支持用户删除与查找食材。
- 菜谱搜索,通过关键词检索 络接口,获取各类食材的常见烹饪做法。
- 私人收藏,对喜爱的做法进行收藏。
5.程序实现及关键代码分析
5.1“添加食材”功能实现及分析
5.1.1基于本地数据库的数据持久化
考虑到菜篮中的食材数据是本手机软件(APP)的关键数据,而保存在文件系统中的数据文件分散程度较高,程序难以读取与管理;采用本地数据库对数据进行存储,数据库技术能够帮助我们实现数据共享,避免不同用户建立独立的重复数据,从而进行数据的集中统一控制管理。
通过food_store.class文件创建数据库(见下方代码),并实现了对数据库的增删改查操作,利用TextView对查询数据的正确性进行了测试。
food_store_database helper; helper = new food_store_database(food_store.this, “basket.db”, null, 1); Button create_basket = (Button) findViewById(R.id.button1); create_basket.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { helper.getWritableDatabase(); } }); |
针对食材建立了basket.db文件,并执行SQL语句创建表basket
其各字段的数据类型、索引与字段名如下
索引 |
字段名称 |
数据类型 |
解释 |
0 |
id |
整型 |
主键 |
1 |
name |
字符串 |
名称 |
2 |
date |
字符串 |
购入时间 |
3 |
price |
实数 |
价格 |
4 |
time |
实数 |
保鲜时长 |
5 |
timeunit |
字符串 |
保鲜时长单位 |
6 |
number |
实数 |
数目 |
7 |
numberunit |
字符串 |
数目单位 |
8 |
classify |
字符串 |
类别 |
9 |
address |
字符串 |
图片地址 |
public static final String CREATE_basket=”create table basket(“ +”id integer primary key autoincrement,” + “name text,” + “date text,” + “price real,” + “time real,” + “timeunit text,” + “number real,” + “numberunit text,” + “classify text,” + “address text)”; db.execSQL(CREATE_basket); |
创建数据库表格表basket关键代码如下:
5.1.2 界面设计
数据库建立后,建立“添加食材”页面,为了制作自定义顶部栏,修改themes.xml文件去除了页面的默认顶部栏。
利用layout代码,自定义了基础的顶部栏,在其中添加了“
为实现用户调用相机拍照,并将JPG文件存储至数据库的功能,实现FileProvider类,并在res资源文件路径下建立file_paths.xml文件,从而指定文件存储路径。
调用相机拍照并进行存储的关键代码如下:
用户点击拍照后,照片路径便被存储在数据库中,而其路径下对应的图片存储在虚拟机的内存文件中。
image_uri=FileProvider.getUriForFile(food_add.this,"com.example.Basket.fileprovider",outputImage); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, image_uri); startActivityForResult(intent, 1); |
路径例如“/storage/emulated/0/Android/data/com.example.basket/cache/id3.jpg”
通过这种组织方式,能够将不定量数目的图片有效存储,而不是依赖于Android R中的资源文件。
通过EditText文本框获取用户输入,并将信息组织为一条长记录,插入在数据库中,以ID作为主键从而保证对数据库的操作不会出错。
利用EditText的setText(null)方法与picture.setVisibility(View.GONE)方法;,将用户的输入与照片清空,便捷用户下一轮的输入。
5.2“菜篮状况”功能实现及分析
5.2.1动态SQL语句分类查找
check_classify[0] =classify[position]; //准备数据 在此查询数据库 String name; String path; //需要获取名称与图片路径 Cursor cursor_food = db.rawQuery("select * from Basket where classify =, new String[]{check_classify[0]}); |
动态调整SQL语句,从而获取不同分类
用户进行分类的选择,因此需要实现界面左侧classify的ListView,根据用户对ListView的点击事件来获取用户选择的分类,同步更新右侧ListView展示食材:
将分类查询数据库后的获取的食材列表分配适配器中,并加载ListView:
//准备菜篮食物列表listview_ ListView listView_ = (ListView) findViewById(R.id.food_list); //准备food_list 适配器 FoodAdaper adapter_ = new FoodAdaper(basket_food_.this, R.layout.fooditem, foodList); listView_.setAdapter(adapter_); listView_.setOnItemClickListener(new AdapterView.OnItemClickListener() { |
5.2.2 界面设计
为使得布局清晰,使用ImageView与ListView类进行线性布局的排布;左侧为类别列表,其包含项目为“蔬菜”“豆制”“水产”“肉禽”“水果”“速食”“饮品”“辅料”“粮油”
而右侧列表为数据库中食材内容,通过对数据库的查询结果来填充。
public void onItemClick(AdapterView int jcdun; for(jcdun=0;jcdun View tv = listView_classify.getChildAt(jcdun); tv.setBackgroundColor(Color.parseColor("#f7f7f7")); //利用整数jcdun遍历整个listview //将所有的背景色设置为默认的灰色 } listView_classify.getChildAt( position-listView_classify.getFirstVisiblePosition()) .setBackgroundColor(Color.parseColor("#fd8e0a")); //将选中的方框背景色修改为橙色 |
为了使得界面更加美化,修改并调整分类列表选中项的背景色,并保证其他未被选中项中背景色为灰色,该效果使用ListView. setOnItemClickListener与View.setBackgroundColor实现,关键代码如下:
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.food_tap); RadioButton radioButton = (RadioButton) findViewById(radioGroup.getCheckedRadioButtonId()); TextView textView = (TextView) findViewById(R.id.food_top_title); radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId == R.id.food_tab_home) { textView.setText("首页"); Intent it = new Intent(getApplicationContext(), home_.class); startActivity(it); } else if (checkedId == R.id.food_tab_book) { textView.setText("食谱"); Intent it = new Intent(getApplicationContext(), book.class); startActivity(it); } else if (checkedId == R.id.food_tab_food) { textView.setText("菜篮"); } else if (checkedId == R.id.food_tab_my) { textView.setText("我的"); & 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
MATLAB设计课题推荐及选择老师技巧
上一篇
2022年9月20日
Stm32 简单实现软件调用bootloader
下一篇
2022年9月20日
|