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

news2024/9/8 22:58:17

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;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化控件
        mBottomNavigationView = findViewById(R.id.bottomNavigationView);
        //mBottomNavigationView设置点击事件
        mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public 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;


    @Override
    protected 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() {
            @Override
            public 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启动一个页面,并且在该页面要设置setResult
                            setResult(1000);
                            finish();
                        }else {
                            Toast.makeText(UpdatePwdActivity.this, "修改失败", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }
        });

        //返回
        findViewById(R.id.toolbar).setOnClickListener(new View.OnClickListener() {
            @Override
            public 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;


    @Override
    protected 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() {
            @Override
            public 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() {
            @Override
            public void onClick(View v) {

                new AlertDialog.Builder(ProductDetailsActivity.this)
                        .setTitle("确认是否加入到购物车?")
                        .setPositiveButton("确认", new DialogInterface.OnClickListener() {
                            @Override
                            public 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() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        })
                        .show();

            }
        });


    }
}

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

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

相关文章

Java 中的 switch 语句:类型支持与限制

Java 中的 switch 语句:类型支持与限制 1、switch 语句支持的数据类型2、switch 语句不支持的数据类型3、总结 💖The Begin💖点点关注,收藏不迷路💖 在 Java 中,switch 语句是一种用于多分支选择的控制结构…

vscode单独设置项目的字符集

vscode有个默认的字符集,直接修改这里的话将会修改整个vscode工具的字符集。如果不同的项目使用不同的字符集,就不能修改这个默认的设置了。而是需要针对每个项目进行修改。 修改方法: 使用shiftctrlp进入settings的菜单页面,点击…

ARM体系结构及接口技术介绍(一)相关概念 寄存器

文章目录 一、ARM相关概念1. 机器码:计算机可以识别的0和1组成的特殊的编码2. 汇编指令:编译器可以将每条汇编指令编译生成特定的计算机可以识别的机器码3. 汇编指令集:很多具有不同功能的汇编指令的集合4. 架构:基于不同的汇编指…

resistronic焊接机RMF10 RE120安装SSK10说明操作

resistronic焊接机RMF10 RE120安装SSK10说明操作

新开发的软件老被系统拦截有什么办法解决吗?

一套新开发的软件要想在windows操作系统畅通无阻,那就需要使用代码签名证书,只要是对软件进行实名从而证明软件发布者身份,确保该软件是一个合法有效的主体开发的,也是让这个软件开发者承担相应的责任。 特别主要如果要获得即时性…

【AI前沿】深度学习:技术、发展与前沿应用

文章目录 一、深度学习的背景与发展1.1 背景1.2 早期发展1.3 突破性进展1.4 近年发展 二、深度学习的基本概念2.1 神经网络2.2 多层感知器(MLP)2.3 卷积神经网络(CNN)2.4 循环神经网络(RNN)2.5 生成对抗网络…

【结构型模式-代理模式】

概述 由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象与目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生…

Linux--网络设置

目录 一、测试网络连接 1、查看网络接口信息 1.1 ifconfig 命令---查看网络接口信息 1.1.1 ifconfig 网卡 #单独查看某个网卡 1.1.2 ifconfig -a #显示所有活动及非活动的连接 二、修改网络配置文件 三、设置网络接口参数 3.1 启用、禁用网络接口配置 3.2 hostn…

数据库数据恢复—SQL Server数据库由于存放空间不足报错的数据恢复案例

SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生…

Python爬虫速成之路(1):获取网页源代码

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命Coding-CSDN博客 &a…

LLM-阿里云 DashVector + ModelScope 多模态向量化实时文本搜图实战总结

文章目录 前言步骤图片数据Embedding入库文本检索 完整代码 前言 本文使用阿里云的向量检索服务(DashVector),结合 ONE-PEACE多模态模型,构建实时的“文本搜图片”的多模态检索能力。整体流程如下: 多模态数据Embedd…

【python】QWidget父子关系,控件显示优先级原理剖析与应用实战演练

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

变位齿轮的齿高好像不变

通过这个软件的计算,变位尺寸的大小径都会同时变化,从而整个齿高好像没有变化。 下面百度答案

中国AI已遥遥领先

关注卢松松,会经常给你分享一些我的经验和观点。 种种迹象表明,中国的AI产业是仅次于美国的存在,中国的AI已经遥遥领先,其他国家。 根据中国信息通信研究院发布的报告称: 根据中国信息通信研究院近日发布的《全球…

LabVIEW远程实验数据采集系统

随着科学研究的不断发展,实验室对远程数据采集和监控的需求越来越高。传统的数据采集方式往往需要实验人员亲临现场,费时费力,且数据实时性较差。为了解决这些问题,基于LabVIEW开发了一套远程实验数据采集系统,实现对实…

网络建设与运维23国赛网络运维正式赛题解析

竞赛环境请看主页! 23国赛网络运维 任务描述:某集团公司在更新设备后,路由之间无法正常通信,请修 复网络达到正常通信。 (1) 请在server1“管理员”下拉菜单中选择“镜像”选项卡,点 击 “创…

就业平台小程序的设计

管理员账户功能包括:系统首页,个人中心,学生管理,企业管理,企业类型管理,留言板管理,系统管理 微信端账号功能包括:系统首页,招聘信息,简历,我的…

centos安装数据库同步工具sqoop并导入数据,导出数据,添加定时任务

目录 1.安装jdk 1.1上传jdk安装包到/opt目录下并解压 1.2解压 1.3配置环境变量 2.安装hadoop 2.1.下载hadoop 2.2.解压hadoop 2.3配置环境变量 3.安装sqoop 3.1下载 3.2解压 3.3下载依赖包并复制到指定位置 3.3.1下载commons-lang-2.6-bin.tar.gz 3.3.2将mysql-c…

2024Q2全球PC市场:联想增3.7%、苹果增20.8%

7月9日,IDC发布最新PC市场报告,称2024年第2季度全球PC出货量 6490 万台,同比增长3.0%,尽管整体市场得益于与2023年较低数据的有利比较,但中国的PC市场仍处于疲软态势。除中国外,全球出货量同比增长超过5%。…

ubuntu部署minio集群

minio集群介绍 官方文档:https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html 本方案采用在多节点多驱动器 (MNMD) 或“分布式”配置部署 MinIO。 MNMD 部署提供企业级性能、可用​​性和可扩展性&#…