基于Android平台开发,购物商城

1. 项目功能思维导图

在这里插入图片描述

2. 项目涉及到的技术点

  1. 使用SQLite数据库实现数据存储
  2. 使用CountDownTimer实现启动页倒计时
  3. 使用SharedPreferences实现记住密码登录
  4. 使用BottomNavigationView实现底部导航栏
  5. 使用Activity+Fragment实现底部导航栏页面之间切换
  6. 使用RecyclerView+adapter实现商品列表
  7. 使用CardView卡片控件实现头像圆角
  8. 使用AlertDialog自定义布局来实现收货地址

3. 项目截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4. 项目部分功能代码实现

  1. 底部导航栏实现
public class MainActivity extends AppCompatActivity {private HomeFragment mHomeFragment;private CarFragment mCarFragment;private OrderFragment mOrderFragment;private MineFragment mMineFragment;private BottomNavigationView mBottomNavigationView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化控件mBottomNavigationView = findViewById(R.id.bottomNavigationView);//mBottomNavigationView设置点击事件mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem item) {if (item.getItemId() == R.id.home) {selectedFragment(0);} else if (item.getItemId() == R.id.car) {selectedFragment(1);} else if (item.getItemId() == R.id.order) {selectedFragment(2);} else {selectedFragment(3);}return true;}});//默认首页选中selectedFragment(0);}private void selectedFragment(int position) {FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();hideFragment(fragmentTransaction);if (position == 0) {if (mHomeFragment == null) {mHomeFragment = new HomeFragment();fragmentTransaction.add(R.id.content, mHomeFragment);} else {fragmentTransaction.show(mHomeFragment);}} else if (position == 1) {if (mCarFragment == null) {mCarFragment = new CarFragment();fragmentTransaction.add(R.id.content, mCarFragment);} else {fragmentTransaction.show(mCarFragment);mCarFragment.loadData();}} else if (position == 2) {if (mOrderFragment == null) {mOrderFragment = new OrderFragment();fragmentTransaction.add(R.id.content, mOrderFragment);} else {fragmentTransaction.show(mOrderFragment);mOrderFragment.loadData();}} else {if (mMineFragment == null) {mMineFragment = new MineFragment();fragmentTransaction.add(R.id.content, mMineFragment);} else {fragmentTransaction.show(mMineFragment);}}//一定要提交fragmentTransaction.commit();}private void hideFragment(FragmentTransaction fragmentTransaction) {if (mHomeFragment != null) {fragmentTransaction.hide(mHomeFragment);}if (mCarFragment != null) {fragmentTransaction.hide(mCarFragment);}if (mOrderFragment != null) {fragmentTransaction.hide(mOrderFragment);}if (mMineFragment != null) {fragmentTransaction.hide(mMineFragment);}}
}
  1. 修改密码
public class UpdatePwdActivity extends AppCompatActivity {private EditText et_new_password;private EditText et_confirm_password;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_update_pwd);//初始化控件et_new_password =findViewById(R.id.et_new_password);et_confirm_password =findViewById(R.id.et_confirm_password);//修改密码点击事件findViewById(R.id.btn_update_pwd).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String new_pwd =et_new_password.getText().toString();String confirm_pwd =et_confirm_password.getText().toString();if (TextUtils.isEmpty(new_pwd) || TextUtils.isEmpty(confirm_pwd)){Toast.makeText(UpdatePwdActivity.this, "信息不能为空", Toast.LENGTH_SHORT).show();}else if(!new_pwd.equals(confirm_pwd)){Toast.makeText(UpdatePwdActivity.this, "新密码和确认密码不一致", Toast.LENGTH_SHORT).show();}else {UserInfo userInfo = UserInfo.getUserInfo();if (null!=userInfo){int row = UserDbHelper.getInstance(UpdatePwdActivity.this).updatePwd(userInfo.getUsername(), new_pwd);if (row>0){Toast.makeText(UpdatePwdActivity.this, "密码修改成功,请重新登录", Toast.LENGTH_SHORT).show();//回传的时候要用 startActivityForResult启动一个页面,并且在该页面要设置setResultsetResult(1000);finish();}else {Toast.makeText(UpdatePwdActivity.this, "修改失败", Toast.LENGTH_SHORT).show();}}}}});//返回findViewById(R.id.toolbar).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});}
}
  1. 商品详情
public class ProductDetailsActivity extends AppCompatActivity {private ImageView product_img;private TextView product_title;private TextView product_price;private TextView product_details;private ProductInfo productInfo;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_product_details);//获取传递的数据productInfo = (ProductInfo) getIntent().getSerializableExtra("productInfo");//返回findViewById(R.id.toolbar).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});//初始化控件product_img = findViewById(R.id.product_img);product_title = findViewById(R.id.product_title);product_price = findViewById(R.id.product_price);product_details = findViewById(R.id.product_details);//设置数据if (null != productInfo) {product_img.setImageResource(productInfo.getProduct_img());product_title.setText(productInfo.getProduct_title());product_details.setText(productInfo.getProduct_details());product_price.setText(productInfo.getProduct_price() + "");}//加入购物车findViewById(R.id.addCar).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new AlertDialog.Builder(ProductDetailsActivity.this).setTitle("确认是否加入到购物车?").setPositiveButton("确认", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {UserInfo userInfo = UserInfo.getUserInfo();if (userInfo != null) {//加入到购物车int row = CarDbHelper.getInstance(ProductDetailsActivity.this).addCar(userInfo.getUsername(), productInfo.getProduct_id(), productInfo.getProduct_img(), productInfo.getProduct_title(), productInfo.getProduct_price());if (row > 0) {Toast.makeText(ProductDetailsActivity.this, "添加成功", Toast.LENGTH_SHORT).show();finish();} else {Toast.makeText(ProductDetailsActivity.this, "添加失败", Toast.LENGTH_SHORT).show();}}}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();}});}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机之穿越机注意事项篇

一、检查设备 每次飞行前都要仔细检查穿越机的每个部件,确保所有功能正常,特别是电池和电机。 二、遵守法律 了解并遵循你所在地区关于无人机的飞行规定,避免非法飞行。 三、评估环境 在飞行前检查周围环境,确保没有障碍物和…

在openSUSE-Leap-15.6-DVD-x86_64下停用USB无线网卡驱动rtw88_8822bu改用rtl88x2bu

在openSUSE-Leap-15.6-DVD-x86_64下停用USB无线网卡驱动rtw88_8822bu改用rtl88x2bu 一、openSUSE-Leap-15.6-DVD-x86_64自带USB无线网卡驱动rtw88_8822bu能够正常上网但不能让USB无线网卡内置小灯闪蓝光 当有数据流量通过USB无线网卡,其内置小灯会不断闪蓝光的&…

前端复刻百度网址精简版HTML+CSS

案列图&#xff1a; 自制效果图&#xff1a; 源代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

雷达视频采集卡 HPx-410

产品简介 雷达视频采集卡 HPx-410&#xff0c;应用于接入导航雷达数据&#xff0c;导航雷达视频&#xff0c;适用于JRC雷达、古野furuon雷达、Sperry雷达等多种型号的雷达。 HPx-410 可以接入导航雷达数据&#xff0c;引入导航雷达原始回波&#xff0c;然后将雷达视频采集到计…

如何用IP地址申请SSL证书实现网络安全

互联网是一个全球性的网络&#xff0c;它将世界各地的计算机系统和设备连接在一起。在这个庞大的网络中&#xff0c;每个设备都需要一个唯一的标识符&#xff0c;即IP&#xff08;Internet Protocol&#xff09;地址&#xff0c;以便其他设备能够找到并与其通信。然而&#xff…

C# + halcon 联合编程示例

C# halcon 联合编程示例 实现功能 1.加载图像 2.画直线&#xff0c;画圆&#xff0c;画矩形, 画椭圆 ROI&#xff0c;可以调整大小和位置 3.实现找边&#xff0c;找圆功能 效果 开发环境 Visual Studio 2022 .NET Framework 4.8 halcondotnet.dll 查看帮助文档 项目结构 DL…

探索东芝 TCD1304DG 线性图像传感器的功能

主要特性 高灵敏度和低暗电流 TCD1304DG 具有高灵敏度和低暗电流&#xff0c;非常适合需要精确和可靠图像捕捉的应用。传感器包含 3648 个光敏元件&#xff0c;每个元件尺寸为 8 m x 200 m&#xff0c;确保了出色的光灵敏度和分辨率。 电子快门功能 内置的电子快门功能是 T…

力扣爆刷第162天之TOP100五连刷76-80(最小路径和、最长公共前缀、最长连续序列)

力扣爆刷第162天之TOP100五连刷76-80&#xff08;最小路径和、最长公共前缀、最长连续序列&#xff09; 文章目录 力扣爆刷第162天之TOP100五连刷76-80&#xff08;最小路径和、最长公共前缀、最长连续序列&#xff09;一、64. 最小路径和二、221. 最大正方形三、162. 寻找峰值…

mysql判断时间段是否重合

mysql判断时间段是否重合 SELECT CASE WHEN t1.start_time < t2.end_time AND t1.end_time > t2.start_time THEN ‘重合’ ELSE ‘不重合’ END AS result FROM table_name t1, table_name t2 WHERE t1.id <> t2.id;

14-26 剑和侠客 – 预训练模型三部曲3 – 机器人时代来临

概述 在第 1 部分和第 2 部分中&#xff0c;我们讨论了适用于文本和图像任务的预训练模型&#xff0c;并探索了当今常用的模型。我们分析了这些模型的架构以及如何将它们用于特定任务。实现 AGI 所需的两个主要支柱是语言理解和机器的视觉能力。有许多任务与这两种能力有关。 …

中职网络安全B模块渗透测试system0016

访问http://靶机IP/web1/,获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b; 可能会跳转8000端口删除进入80端口 进入后点击侦查一下&#xff0c;这里乱码了&#xff0c;我们点击查看是一个柯南&#xff0c;web但这是一个web题目肯定不是隐写术&#xff0c;所以说题目的…

CDF累积分布函数和PPF百分点位分布函数

目录 cdf累积分布函数 (CDF) ppf百分位点函数 (PPF) 区别与联系示例关系和区别 cdf 累积分布函数 (CDF) 定义&#xff1a; 累积分布函数 F ( x ) F(x) F(x) 给出随机变量 X X X 小于或等于某个值 x x x 的概率。数学定义&#xff1a; F ( x ) P ( X ≤ x ) F(x) P(X \l…

163邮件通知提醒功能怎么开?有哪些优势?

163邮件通知提醒如何定制&#xff1f;设置邮件通知提醒的步骤&#xff1f; 163邮箱作为一款常用的电子邮件服务工具&#xff0c;其邮件通知提醒功能能有效帮助用户及时处理重要邮件&#xff0c;提高工作效率。AokSend将详细介绍如何在163邮箱中开启邮件通知提醒功能&#xff0…

科普文:从Redis1.0到Redis7.0的发展历程来理解为什么Redis钟爱单线程

概叙 Redis 作为一款流行的开源数据库&#xff0c;每个版本都在不断的迭代和升级&#xff0c;新增了丰富的特性和功能&#xff0c;解决了更多实际应用场景中的问题&#xff0c;提高了 Redis 的性能和可靠性。 总体来说&#xff0c;Redis 的演化之路可以分为以下几个阶段&#x…

人形机器人头部结构设计

我又回来啦&#xff01;电机部分的教程会继续更新咯~ 前几天做了成图增材赛道&#xff0c;也算4个月以来本人做过最复杂的结构项目。 不知结果会怎么样&#xff0c;但我也尽全力啦&#xff01; 把说明书发在这里&#xff0c;STL已发GitHub&#xff0c;链接&#xff1a; zysampo…

如何视频提取字幕?推荐5款视频字幕提取软件

#7月份我的同事一个个消失了#&#xff0c;这不仅是一个话题标签&#xff0c;更是许多公司面临的现实写照。 在人手紧缺的夏日&#xff0c;如何提高工作效率成为当务之急。特别是对于需要处理视频内容的团队&#xff0c;一款能够快速提取字幕的软件显得尤为重要。 下面&#x…

揭秘小红书矩阵系统:源码助力一键自动发布,多平台管理,效率飙升!

在数字化时代&#xff0c;社交媒体已成为品牌和个人展示自我、推广产品的重要舞台。小红书&#xff0c;作为备受年轻人喜爱的社交平台&#xff0c;其影响力不容小觑。然而&#xff0c;面对日益激烈的竞争&#xff0c;如何高效地在小红书上发布内容、管理多平台账号&#xff0c;…

纯技术分享:淘宝商品详情原数据接口参数解析

item_get_app-获得淘宝app商品详情原数据 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_s…

【JavaEE】Spring AOP详解

一.AOP的定义. Aspect Oriented Programming&#xff08;面向切面编程&#xff09;概括的来说AOP是一种思想, 是对某一类事情的集中处理 什么是面向切面编程呢? 切面就是指某一类特定问题, 所以AOP也可以理解为面向特定方法编程.什么是面向特定方法编程呢? 比如上个博客文章…

百度搜索框制作HTML+CSS

样品图 自制效果图&#xff08;附注释&#xff09; <!DOCTYPE html> <html lang"en"><head><!-- 定义文档的字符编码为UTF-8&#xff0c;以支持中文等多语言字符 --><meta charset"UTF-8" /><!-- 设置页面在不同设备上的…