Android开发一个美食app
系统软件介绍
该软件是一款购买美食的app,名字叫做Cateapp,主要面向于大众群体。
具有用户注册账号和登录功能,没有登录的用户只能查看app上的展示内容,不能对食物商品进行下单
。用户登录之后可以进行对食物商品下单,下单之后可以查看下单记录。如果用户对商品有什么问页在app里边联系客服。
系统实现方案
主要使用Fragment+ViewPager2技术实现主页面的左右滑动屏幕翻页效果;
实现点击底部4个导航选项切换或加载对应的页面;实现点击底部4个选项同时导航颜色做相应变化。
然后通过RecyclerView控件,实现一些列表图片的展示及刷新。通过Intent 启动组件,在组件之间传递信息和页面转换。
通过SQLite数据库存储用户的下单信息,和通过SharedPreferences来保存注册的账号信息
。使用多线程来实现一些图片的异步刷新和启动页的停留。
源码下载:https://download.csdn.net/download/qq_44716544/17860514
或者私聊我拿
桌面图标
代码目录
图片展示:
第二个页面,登录页,注册页
主页面:
联系客服
关键代码
启动页:
pActivity.this.runOnUiThread(new Runnable() { //调用主线程@Overridepublic void run() {t.setText(s[n]); //刷新代码n++;}});try {Thread.sleep(1000); //暂停100毫秒if(n==3){Intent it=new Intent(StartupActivity.this,LoginActivity.class);startActivity(it);finish();}} catch (Exception e) {}}}}).start();
第二个页面,登录页
if(s.equals("")||s2.equals("")) {Toast.makeText(LoginActivity.this,"账号或密码不能为空",Toast.LENGTH_SHORT).show();}
if(s.equals(account)&&s2.equals(password)){
// Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_SHORT).show();Intent i=new Intent();i.setClass(LoginActivity.this,MainActivity.class);//设置跳转的界面i.putExtra("account",s);i.putExtra("state","已登录");startActivity(i);finish();}if(!s.equals(account)||!s2.equals(password)){Toast.makeText(LoginActivity.this,"账号或密码不正确",Toast.LENGTH_SHORT).show();}
主页面
final List<Fragment> list=new ArrayList<>();list.add(new NewFragment());list.add(new ProducstFragment());list.add(new SettlementFragment());list.add(new UserFragment());vp=findViewById(R.id.viewPager); //获得ViewPager2控件
//设置预加载的Fragment页面数量,可防止流式布局StaggeredGrid数组越界错误。vp.setOffscreenPageLimit(list.size() - 1); //设置适配器FragmentStateAdapter adapter=new FragmentStateAdapter(MainActivity.this) {@NonNull@Overridepublic Fragment createFragment(int position) {return list.get(position);}@Overridepublic int getItemCount() {return list.size();}};vp.setAdapter(adapter); //把适配器添加给ViewPager2}
new Thread(new Runnable() {@Overridepublic void run() {activity.runOnUiThread(new Runnable() {@Overridepublic void run() {if((image.length!=0)&&(text.length!=0)){holder.iv.setImageResource(image[position]);holder.tv.setText(text[position]);}}});}
}).start();
holder.tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String s= holder.tv.getText().toString();//获取被点击的文字Intent i=new Intent();i.setClass(activity, NewActivity.class);//设置跳转的界面i.putExtra("name",s);// Toast.makeText(activity,s,Toast.LENGTH_SHORT).show();activity.startActivity(i);//点击左列表选项,加载对应右列表数据。// ProducstFragment.rightrv.setAdapter(new ProductRightAdapter(activity, ProducstFragment.list.get(position)));}
});
holder.iv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String s= holder.tv.getText().toString();//获取被点击的文字Intent i=new Intent();i.setClass(activity, NewActivity.class);//设置跳转的界面i.putExtra("name",s);// Toast.makeText(activity,s,Toast.LENGTH_SHORT).show();activity.startActivity(i);//点击左列表选项,加载对应右列表数据。// ProducstFragment.rightrv.setAdapter(new ProductRightAdapter(activity, ProducstFragment.list.get(position)));}
});
new Thread(new Runnable() {@Overridepublic void run() {activity.runOnUiThread(new Runnable() {@Overridepublic void run() {if((list.size()!=0)){holder.iv.setImageResource(product.getImage());holder.nametv.setText(product.getName());holder.pricetv.setText(" "+product.getPrice());}}});}
}).start();
//点击选项里的添加按钮要执行的操作
holder.bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//如果已选的小吃数据集合里没有该小吃if(!app.selectedproduct.contains(list.get(position))){product.setNumber(1); //设置数量app.selectedproduct.add(product); //添加当前选项数据到集合//添加当前选项价格到总价app.countprice +=Double.parseDouble(product.getPrice());Toast.makeText(activity,"添加成功",Toast.LENGTH_SHORT).show();}else{ //如果已选的小吃数据集合里已有该小吃Toast.makeText(activity,"已经有了",Toast.LENGTH_SHORT).show();}}
});
新品页面
Intent intent=getIntent();String name=intent.getStringExtra("name");//获取菜名for(int i=0;i<text.length;i++){if(text[i].equals(name)){position=i;break;}}// Toast.makeText(NewActivity.this,text.length,Toast.LENGTH_SHORT).show();ImageView foodimage=findViewById(R.id.foodimage);foodimage.setImageResource(image[position]);//设置食物图片TextView foodid=findViewById(R.id.foodid);foodid.setText(text[position]);foodname=findViewById(R.id.foodname);foodname.setText(text2[position]);
}
Button buttonorder=findViewById(R.id.buttonorder);
buttonorder.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {app = (AppData) NewActivity.this.getApplication(); //获得全局类if (app.check.equals("已登录")) {if (num >= 1) {String pricesum2 = Integer.toString(pricesum);//获取菜名,价格,数量,并添加的集合里。Product product = new Product();product.setImage(image[position]);product.setName(text[position]);product.setPrice(pricesum2);product.setNumber(num);app.countprice = pricesum;app.selectedproduct.add(product); //添加当前选项数据到集合Toast.makeText(NewActivity.this, "下单成功", Toast.LENGTH_SHORT).show();// save();} else {Toast.makeText(NewActivity.this, "你还没有选择数量", Toast.LENGTH_SHORT).show();}} else {Toast.makeText(NewActivity.this, "你还没有登录,请先登录", Toast.LENGTH_SHORT).show();}}
});
购买记录页面
app = (AppData) RecordActivity.this.getApplication(); //获得全局类// Toast.makeText(RecordActivity.this, app.account+"message", Toast.LENGTH_SHORT).show();
MyHelper helper=new MyHelper(RecordActivity.this,app.account+".db",null,1);SQLiteDatabase db=helper.getReadableDatabase();Cursor cursor=db.query("information",null,null,null,null,null,null);if(cursor.getCount()!=0){while (cursor.moveToNext()){String _id = cursor.getString(cursor.getColumnIndex("_id"));String image = cursor.getString(cursor.getColumnIndex("image"));String name = cursor.getString(cursor.getColumnIndex("name"));String price = cursor.getString(cursor.getColumnIndex("price"));String time1 = cursor.getString(cursor.getColumnIndex("time1"));name2[num]=name;image2[num]=image;price2[num]=price;time2[num]=time1;num++;// Toast.makeText(RecordActivity.this, app.account+"message"+message[0], Toast.LENGTH_SHORT).show();}cursor.close();}
联系客服页面
* 判断是否有某项权限* @param string_permission 权限* @param request_code 请求码* @return*/public boolean checkReadPermission(String string_permission,int request_code) {boolean flag = false;if (ContextCompat.checkSelfPermission(getActivity(), string_permission) == PackageManager.PERMISSION_GRANTED) {//已有权限flag = true;} else {//申请权限ActivityCompat.requestPermissions(getActivity(), new String[]{string_permission}, request_code);}return flag;}/*** 检查权限后的回调* @param requestCode 请求码* @param permissions 权限* @param grantResults 结果*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case REQUEST_CALL_PERMISSION: //拨打电话if (permissions.length != 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {//失败Toast.makeText(getActivity(),"请允许拨号权限后再试",Toast.LENGTH_SHORT).show();} else {//成功call("tel:"+"10086");}break;}}/*** 拨打电话(直接拨打)* @param telPhone 电话*/public void call(String telPhone){if(checkReadPermission(Manifest.permission.CALL_PHONE,REQUEST_CALL_PERMISSION)){Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(telPhone));startActivity(intent);}}
}
Android开发一个美食app相关推荐
- 自己怎么开发一个软件app、如何开发一个app系统软件?
自己怎么开发一个软件app.如何开发一个app系统软件? 华盛恒辉开发app软件的办法如下: 1.华盛恒辉首先本人明白需求,懂代码,熟习开发流程. 2.华盛恒辉APP开发后期需求理解产品定位. 3. ...
- android开发 一个更优的listView的写法
android开发 一个更优的listView的写法 布局xml <?xml version="1.0" encoding="utf-8"?> &l ...
- 用android开发一个识别人形的app,一键切换背景
前言:我是小松,今年大四,在android开发中持续耕耘,快来一起学习把 不知道大家有没有这种烦恼,手上有白底的证件照,但是学校偏偏要交红底的,万般无奈只能去照相馆再照,虽说可以进行PS,但是总归麻烦 ...
- android实现过程,Android:一个完整app开发流程
一.给出功能文档 二.APP架构选择 可选MVP,MVVM 三.APP目录结构设置 本app基于mvp架构.除了mvp架构的文件. 还包含下面的文件夹: ui (下面根据Activity划分) wid ...
- Android开发规范:APP版本发布(全量发布、灰度发布)
我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 全量发布 灰度发布 欢迎加入Android开发交流QQ群: app ...
- 基于Android开发的天气预报app(源码下载)
基于AndroidStudio环境开发的天气app 由于需要源码的人特别多,我特地花时间新增了对最新IDE版本Android Studio Chipmunk | 2021.2.1 Patch 1的支持 ...
- 【开源项目】Android开发内置App自动升级
1.准备工作,首先需要在AndroidManifest.xml中的application中加入以下内容 <providerandroid:name="android.support.v ...
- 人工智能离前端并不远 一步步教你开发一个机器学习APP(附源码)
最近HBO电视网推出的美剧<硅谷Silicon Valley>席卷全球,里面有一个桥段介绍了超级有趣的iOS app- Not Hotdog.你甚至可以在APP Store上下载到它. 受 ...
- android 所有运行程序闪退,Android开发,运行app闪退的解决方法
满意答案 lawlovefat 2015.03.09 采纳率:52% 等级:12 已帮助:8866人 Andro开发解决5.0安装成功后打开直接闪退问题,andro5.0 这阵子在开发一个app ...
最新文章
- git搜索--grep
- C篇(一) 用Codeblocks建立一个C的工程
- Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)--转
- Kali 渗透测试—Metasploit
- 牛客多校2 - Greater and Greater(bitset优化暴力)
- lpv4的地址格式由多少个字节组成_我们为什么有这么多字符编码格式?
- Flink on Zeppelin (1) - 入门篇
- 7-31 查验身份证 (15 分)
- UnixBench 测试工具简单使用
- AFNetworking 2.0 来了
- java浏览器无数据,JAVA实现文件下载,浏览器端失去数据没反应
- [算法]代码运行时间增长数量级对比 线性级别N vs 线性对数级别 NlgN
- m4s格式转换mp3_amr转换mp3格式文件
- 技术博客|第13期:Server Side Logging:Hulu推荐系统中的特征漂移问题解决方法
- matlab小船渡河物理模型,【物理】小船渡河模型及关联速度问题
- 自然保护区相关矢量数据下载
- Error:java: 读取xxx.jar时出错; zip file is empty
- margin属性的正负值确定
- 联通数据能力开放平台介绍
- 5GNR漫谈11:PRACH随机接入信道(1)
热门文章
- 一个公司存在不同职位,不同职位计算工资的方法也不相同。工资可能是固定的,也可能根据销售额或工作量来计算。假设公司有三种职务:经理、计件工人和计时工人:他们的工资组成分别为:
- 解决最近easyui官网不能访问问题
- vue中使用keep-alive来优化网页性能
- Android项目实战之高仿网易云音乐项目介绍
- Python代码对英语标点后面缺空格的情况自动补空格
- Qt5设置应用程序图标
- 解决java获取系统时间差8个小时 专题
- 苹果5更新系统无服务器,苹果5手机系统更新不了出现无法检查更新怎么处理
- 一日一签免费算卦_一日一签app免费算卦
- html tr隐藏 边框存在,CSS 设置tr的边框