基于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;所以说题目的…

跨境支付新篇章:引领电商潮流

在东南亚电商经济蓬勃发展的背景下&#xff0c;跨境电商成为了许多企业拓展市场的重要途径。然而&#xff0c;当外国电商企业想要进入中国市场时&#xff0c;他们面临着一系列挑战。这些挑战不仅考验着企业的技术能力&#xff0c;更考验着它们的战略布局和市场适应性。 东南亚…

Eureka应用场景和优势

Eureka是一款由Netflix开源的服务注册与发现框架&#xff0c;在微服务架构中扮演着至关重要的角色。以下是Eureka的应用场景和优势&#xff1a; Eureka的应用场景 Eureka主要应用于微服务架构中&#xff0c;特别是在大型、复杂的分布式系统中&#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…

等保测评视角下的哈尔滨智慧城市安全框架构建

随着智慧城市的兴起&#xff0c;哈尔滨作为东北地区的重要城市&#xff0c;正在积极探索和实践智慧城市安全框架的构建&#xff0c;以确保在数字化转型的过程中&#xff0c;既能享受科技带来的便利&#xff0c;又能有效防范和应对各类网络安全风险。 本文将从等保测评的视角出…

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

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

查看归档日志切换频率

1.查看归档日志切换频率 SET LINE 300 PAGES 9999 COL "00" FOR A3 COL "01" FOR A3 COL "02" FOR A3 COL "03" FOR A3 COL "04" FOR A3 COL "05" FOR A3 COL "06" FOR A3 COL "07" FOR A3 …

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

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

【D3.js in Action 3 精译】D3 入门基础之 Node、JavaScript 框架与 Observable 记事本

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形1.2.3 Canvas 与 WebGL1.2.4 CSS1.2.5 JavaScript1.2.6 Node 与 JavaScript 框架 ✔️1.2.7 Observable 记事…

全网最简单的Java设计模式【六】Java单例模式 懒汉式详解

Java单例模式 懒汉式详解 【创作】 不易&#xff0c;【点赞】 是情义&#xff0c;【关注】 是动力&#xff0c;【收藏】 是回忆。 示例代码地址&#xff1a;https://gitee.com/code-in-java/csdn-blog.git 一、概念与原理 Java中的单例模式是一种确保一个类只有一个实例&#…