资源描述
基于Android平台的菜谱实现
1需求分析
随着手机的广泛普及,无线技术的突飞猛进,移动生活、移动办公逐渐由概念转变为现实,对于传统的餐饮业也产生了潜移默化的影响。
目前,大多数餐厅仍然以传统的纸质菜单为主。但是,这种点菜方式存在诸多弊端:从消费者角度来讲,菜谱不能及时更新,导致菜谱信息陈旧,点菜时经常出现某菜品已下架等情况。
用户需求:从餐厅老板来说,及时更新纸质的菜谱,无疑会增加餐厅的额外支出。为了改善传统纸质菜谱的弊端,将菜谱应用于手机客户端,为消费者带来更为便利的客户体验。而实时的菜品更新,不仅解决了纸质菜谱短时间内就出现脏、乱、差的问题,实现餐厅无纸化操作,而且潜在的提升了饭店的形象。
功能需求:用户可以进入菜单界面选择菜品分类,进入相应的分类内,查看该分类中的菜品信息,并对菜品的等级程度进行评价,查询某特定菜品,也可添加新菜品,删除菜品等。
2功能实现
本APP基于自身的需求,同时对西北大学周围众多餐厅现状的合理分析,结合实际,设计并实现了一个基于移动手机平台的智能菜谱显示,该系统的设计基于Android智能操作系统,简单的SQLite数据库,实现了对菜品的增、删、查、改各个功能。
消费者可以添加要点的菜品,在餐后可以对菜品的口味及好感程度进行具体化的评价,这样是对餐厅工作人员的一个回馈,同时也可以为其他消费者就餐提供建议。
2.1主界面
1、实现了对菜品的具体分类。如图2-1
图2-1
单击所选择的菜品分类,出现菜品的镜像显示,为消费者提供更为直观的视觉效果,有助于消费者做出选择。如图2-2
图2-2
2、是进入菜品显示的入口,同时也显示了该软件的使用方法如图2-3:
图2-3
2.2菜谱显示界面
1、该类菜品中所有菜品的具体展示,菜品名称、菜品分类、菜品描述、菜品编号、以及菜品的星级评价,单选或多选菜品。如图2-4:
图2-4
2、搜索菜品
菜谱显示界面会显示该分类下的所有菜品,当需要直接看到某单个菜品的具体消息时,可以通过搜索框,进行菜名的特定筛选。如图2-5
图2-5
3、对菜品进行添加
4、删除菜品
当菜品长时间被消费者冷落,或者有不想再推出的菜品时,进行及时的删除。为消费者提供实时的消息。如图2-6:
图2-6
2.3菜品添加界面
当有新的菜品推出时,进行及时的添加,为消费者提供更多选择。软件对菜品的分类给与明确的选择,给用户提供便利。如图2-7:
图2-7
3编码
3.1镜像显示
public class MyMirrorGalleryActivity extends Activity{
public MyMirrorGallery gallery;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_gallery);
//Action Bar
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.hide();
actionBar.show(); //---show it again---
gallery=(MyMirrorGallery)findViewById(R.id.Mygallery);
gallery.setAdapter(new MyAdapter(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
CreateMenu(menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
return MenuChoice(item);
}
private void CreateMenu(Menu menu)
{
MenuItem mnu1 = menu.add(0, 0, 0, "详情显示");
{
mnu1.setIcon(R.drawable.ic_launcher);
mnu1.setShowAsAction(
MenuItem.SHOW_AS_ACTION_NEVER |
MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
MenuItem mnu2 = menu.add(0, 1, 1, "软件所有权");
{
mnu2.setIcon(R.drawable.ic_launcher);
mnu2.setShowAsAction(
MenuItem.SHOW_AS_ACTION_NEVER |
MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
MenuItem mnu3 = menu.add(0, 2, 2, "使用说明");
{
mnu3.setIcon(R.drawable.ic_launcher);
mnu3.setShowAsAction(
MenuItem.SHOW_AS_ACTION_NEVER |
MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
}
private boolean MenuChoice(MenuItem item)
{
switch (item.getItemId()) {
case android.R.id.home:
Toast.makeText(this,
"You clicked on the Application icon",
Toast.LENGTH_LONG).show();
Intent i = new Intent(this, MyMirrorGalleryActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
return true;
case 0:
Intent i2 = new Intent(this, MenuActivity.class);
i2.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i2);
return true;
case 1:
Toast.makeText(this, "软件说明:",
Toast.LENGTH_LONG).show();
new AlertDialog.Builder(MyMirrorGalleryActivity.this)
.setTitle("软件说明:")
.setMessage("软件著作:***\n适用范围:所有爱好美食的人\n" )
.setPositiveButton("确定", null)
.show();
return true;
case 2:
Toast.makeText(this, "使用说明",
Toast.LENGTH_LONG).show();
new AlertDialog.Builder(MyMirrorGalleryActivity.this)
.setTitle("使用说明:")
.setMessage("使用方法:\n 1.选择食物类型;\n 2.查看食物\n 3.选择心仪的菜品\n" )
.setPositiveButton("确定", null)
.show();
return true;
}
return false;
}
}
3.2添加菜品
public class AddFoodActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.addfood);
Spinner();
Button btn_save=(Button) findViewById(R.id.btn_save);
btn_save.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
EditText editText1_foodname=(EditText) findViewById(R.id.editText1_foodname);
//EditText spinner1=(EditText) findViewById(R.id.spinner1);
Spinner spinnerGroup = (Spinner) findViewById(R.id.spinner1);
EditText editText1_describe=(EditText) findViewById(R.id.editText1_describe);
String foodname=editText1_foodname.getText().toString();
//String editspinner1=spinner1.getText().toString();
String classification = spinnerGroup.getSelectedItem().toString();
String describe=editText1_describe.getText().toString();
FoodMenu food=new FoodMenu(foodname, describe, classification);
MenuService dbOpenHelper=new MenuService(AddFoodActivity.this);
dbOpenHelper.add(food);
//修改
Intent i = new Intent(AddFoodActivity.this, MenuActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
}
});
}
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.add_food, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void Spinner(){
//分组Spinner填充
ArrayList<String> group = new ArrayList<String>();
group.add("粥品 ");
group.add("派和糕点");
group.add("膨化食品");
group.add("酱菜辅料");
group.add("敢爱敢做");
group.add("饼干");
//创建适配器
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_spinner,R.id.item_style,group);
//获得控件对象
Spinner groupSpinner = (Spinner) this.findViewById(R.id.spinner1);
//设置spinner对象的数据适配器
groupSpinner.setAdapter(adapter);
groupSpinner.setPrompt("食物分类");
}
}
3.3菜谱显示
public class MenuActivity extends Activity{
private ArrayList<CheckBox> checkBox = new ArrayList<CheckBox>();
private boolean[] hasChecked;
private ListView listView;
private RatingBar ratBar;
private android.widget.SimpleAdapter adapter;
private List<Map<String, Object>> listItems;
private Integer[] imgid = {R.drawable.p1,
R.drawable.p2, R.drawable.p3,
R.drawable.p4, R.drawable.p5,
};
private CheckBox check;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去除标题
//this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.showfood);
//Action Bar
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.show(); //---show it again---
//获得搜索按钮对象
ImageButton searchbtn = (ImageButton) findViewById(R.id.searchbtn);
//searchButton注册监听事件
searchbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
EditText searchtext = (EditText) findViewById(R.id.editTextSearch);
String name = searchtext.getText().toString();
MenuService ms = new MenuService(MenuActivity.this);
ArrayList<HashMap<String,Object>> data1 = new ArrayList<HashMap<String,Object>>();
List<FoodMenu> list = ms.QueryAllData();
for(FoodMenu foodmenu:list){
foodmenu.getName().toString();
if(name.equals(foodmenu.getName().toString())){
HashMap<String,Object> foodMap = new HashMap<String,Object>();
foodMap.put("num",foodmenu.getNum());
foodMap.put("name",foodmenu.getName());
foodMap.put("classification",foodmenu.getClassification());
foodMap.put("describe",foodmenu.getDescribe());
data1.add(foodMap);
}
}
int a[]=new int []{R.id.tvno,R.id.tvfoodname,R.id.tvclassification,R.id.bdetail};
adapter = new android.widget.SimpleAdapter(MenuActivity.this.getApplicationContext(), data1, R.layout.list_item2, new String[]{"num","name","classification","describe"}, a);
listView=(ListView) findViewById(R.id.listview);
listView.setTextFilterEnabled(true);
//将listView控件和adapter绑定
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long id) {
// TODO Auto-generated method stub
HashMap<String,Object> itemMap = (HashMap<String, Object>)adapterView.getItemAtPosition(position);
int num = (Integer) itemMap.get("num");
String foodName = (String) itemMap.get("foodName");
String foodClassification = (String) itemMap.get("foodClassificatoin");
String describe = (String) itemMap.get("describe");
FoodMenu foodm = new FoodMenu();
foodm.setNum(num);
foodm.setName(foodName);
foodm.setClassification(foodClassification);
foodm.setDescribe(describe);
Intent intent = new Intent();
intent.putExtra("food", foodm);
intent.setClass(MenuActivity.this, ShowInfoActivity.class);
MenuActivity.this.startActivity(intent);
}
});
}
});
MenuService ms = new MenuService(this);
//查询所有的菜品
List<FoodMenu> list = ms.QueryAllData();
//创建一个ArrayList集合,用于存放拥有food信息的MAP集合
ArrayList<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>();
for(FoodMenu foodmenu:list){
HashMap<String,Object> foodMap = new HashMap<String,Object>();
foodMap.put("num",foodmenu.getNum());
foodMap.put("name",foodmenu.getName());
foodMap.put("classification",foodmenu.getClassification());
foodMap.put("describe",foodmenu.getDescribe());
data.add(foodMap);
}
int a[]=new int []{R.id.tvno,R.id.tvfoodname,R.id.tvclassification,R.id.bdetail};
adapter = new android.widget.SimpleAdapter(this.getApplicationContext(), data, R.layout.list_item2, new String[]{"num","name","classification","describe"}, a);
listView=(ListView) findViewById(R.id.listview);
listView.setTextFilterEnabled(true);
//将listView控件和adapter绑定
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long id) {
// TODO Auto-generated method stub
HashMap<String,Object> itemMap = (HashMap<String, Object>)adapterView.getItemAtPosition(position);
int num = (Integer) itemMap.get("num");
String foodName = (String) itemMap.get("foodName");
String foodClassification = (String) itemMap.get("foodClassificatoin");
String describe = (String) itemMap.get("describe");
FoodMenu foodm = new FoodMenu();
foodm.setNum(num);
foodm.setName(foodName);
foodm.setClassification(foodClassification);
foodm.setDescribe(describe);
Intent intent = new Intent();
intent.putExtra("food", foodm);
intent.setClass(MenuActivity.this, ShowInfoActivity.class);
MenuActivity.this.startActivity(intent);
}
});
check =(CheckBox) findViewById(R.id.check_item);
check.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
//记录食品选中状态
if(isChecked){
MenuService ms = new MenuService(MenuActivity.this);
ms.delete(listView.getCheckedItemPosition());
}
}
});
}
4测试
1、 模块测试
主界面、菜品图片显示界面,菜品信息显示界面,添加界面等之间的跳转是否正常,界面之间的衔接是否合理。经过多次跳转的测试,均到了预期的效果。界面设计虽然精简,使得操作简单,但是界面缺少推送,使得信息太过单一,信息量太少,影响用户体验。
2、 单元测试
增、删、查、改是否正常
(1)测试增加功能:
在添加界面添加一道新菜品:草莓蛋糕,点击保存后,菜品
添加功能测试
测试用例
测试目的
测试结果
测试用例一
添加草莓蛋糕
选择分类是否实现
成功选择分类
测试用例二
添加抹茶慕斯
单击保存后是否成功添加到菜单,是否成功显示添加菜品的信息
添加成功且信息正确
(2)测试删除功能
删除功能测试
测试用例
测试目的
测试结果
测试用例一
选中草莓蛋糕
是否将该菜品删除
成功删除
测试用例二
清空菜单按钮
单击后是否将菜单中所有菜品删除
菜单清空
(3)测试查询功能
查询功能测试
测试用例
测试目的
测试结果
测试用例一
选中草莓蛋糕
是否将该菜品在菜单中单独显示
单独显示
测试用例二
选中抹茶慕斯
查询到的信息是否正确
信息正确
(4)等级评价测试
评价功能测试
测试用例
测试目的
测试结果
测试用例一
评价草莓蛋糕
能否给出星级评价
成功评级
3、 数据库测试
测试添加的菜品是否成功记录到数据库中,删除的菜品是否在数据库中移除,经多次测试,每次添加的菜品均可添加到数据库表中,删除的菜品也会在表中消失。
5期望
本软件真正运用到市场时,仍存在很多问题。后期设计将食客与饭店分开成为两个独立的个体,但是之间的交互更为密切,功能更为明确。食客端订餐,评价菜品,查询菜品。而饭店用户端,可以对食客反馈的信息进行管理,对食客给与的建议进行整合,进行对菜品的改进以及调整。并且添加一些推送信息,给食客更丰富的资讯,带来更好的用户体验。
展开阅读全文