基于Android平台开发,备忘录记事本

news2024/11/14 18:46:40

相关视频教程在某站上面(🔍浩宇软件开发)

1. 项目功能思维导图

在这里插入图片描述

2. 项目涉及到的技术点

  1. 使用CountDownTimer实现开屏页倒计时
  2. 使用SQLite数据库存储数据
  3. 使用BottomNavigationView实现底部导航栏
  4. 使用Activity+Fragment实现底部导航栏页面切换
  5. 使用RecyclerView+adapter实现首页,搜索页列表
  6. 使用AlertDialog实现置顶,编辑,删除单选功能
  7. 使用CardView实现卡片,头像圆角效果
  8. 使用Toolbar实现顶部标题栏

3. 项目运行效果图

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

4. 项目部分功能实现

  1. 新建页面
public class CreateNoteActivity extends BaseActivity {
    private EditText et_note_title;
    private EditText et_note_content;
    private Toolbar toolbar;
    private Button btn_submit;

    private NoteInfo noteInfo;

    @Override
    protected int getLayoutResId() {
        return R.layout.activity_create_note;
    }

    @Override
    protected void initViews() {
        et_note_title = findViewById(R.id.et_note_title);
        et_note_content = findViewById(R.id.et_note_content);
        toolbar = findViewById(R.id.toolbar);
        btn_submit = findViewById(R.id.btn_submit);
    }

    @Override
    protected void setListener() {

        //返回
        toolbar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        btn_submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String title = et_note_title.getText().toString();
                String content = et_note_content.getText().toString();
                if (TextUtils.isEmpty(title) || TextUtils.isEmpty(content)) {
                    Toast.makeText(CreateNoteActivity.this, "请完善信息~~", Toast.LENGTH_SHORT).show();
                } else {
                    UserInfo userInfo = UserInfo.getUserInfo();

                    if (noteInfo == null) {
                        int row = NoteDbHelper.getInstance(CreateNoteActivity.this).createNote(userInfo.getUsername(), title, content);
                        if (row > 0) {
                            Toast.makeText(CreateNoteActivity.this, "创建成功~~", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(CreateNoteActivity.this, "创建失败~~", Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        int row = NoteDbHelper.getInstance(CreateNoteActivity.this).editNote(noteInfo.getNote_id(), title, content);
                        if (row > 0) {
                            Toast.makeText(CreateNoteActivity.this, "修改成功~~", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(CreateNoteActivity.this, "修改成功~~", Toast.LENGTH_SHORT).show();
                        }
                    }

                    setResult(1000);
                    finish();
                }
            }
        });
    }

    @Override
    protected void initData() {

        //跳转传值
        noteInfo = (NoteInfo) getIntent().getSerializableExtra("noteInfo");

        if (noteInfo != null) {
            toolbar.setTitle("编辑备忘录");
            btn_submit.setText("编辑");

            et_note_title.setText(noteInfo.getNote_title());
            et_note_content.setText(noteInfo.getNote_content());
        }

    }
}
  1. 搜索页面
public class SearchFragment extends BaseFragment {
    private EditText et_search;
    private RecyclerView recyclerView;
    private LinearLayoutCompat ll_empty;

    private SearchListAdapter mListAdapter;


    @Override
    protected int getLayoutResId() {
        return R.layout.fragment_search;
    }

    @Override
    protected void initView() {
        et_search = rootView.findViewById(R.id.et_search);
        ll_empty = rootView.findViewById(R.id.ll_empty);
        recyclerView = rootView.findViewById(R.id.recyclerView);

        //初始化适配器
        mListAdapter = new SearchListAdapter();

        //设置适配器
        recyclerView.setAdapter(mListAdapter);

        //mListAdapter点击事件
        mListAdapter.setOnItemClickListener(new SearchListAdapter.onItemClickListener() {
            @Override
            public void onItemClick(int position, NoteInfo noteInfo) {
                Intent intent = new Intent(getActivity(), NoteDetailsActivity.class);
                intent.putExtra("noteInfo", noteInfo);
                startActivity(intent);
            }
        });

    }

    @Override
    protected void setListener() {

        rootView.findViewById(R.id.btn_search).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String content = et_search.getText().toString();
                if (TextUtils.isEmpty(content)) {
                    Toast.makeText(getActivity(), "搜索内容不能为空~", Toast.LENGTH_SHORT).show();
                } else {
                    List<NoteInfo> noteInfoList = NoteDbHelper.getInstance(getActivity()).searchNote(content);

                    if (null != mListAdapter) {
                        mListAdapter.setNoteInfoList(noteInfoList);
                    }

                    if (noteInfoList.size() == 0) {
                        ll_empty.setVisibility(View.VISIBLE);
                    } else {
                        ll_empty.setVisibility(View.GONE);
                    }


                }
            }
        });

    }

    @Override
    protected void initData() {

    }
}
  1. 修改密码页面
public class UpdatePwdActivity extends BaseActivity {
    private EditText et_new_password;
    private EditText et_confirm_password;


    @Override
    protected int getLayoutResId() {
        return R.layout.activity_update_pwd;
    }

    @Override
    protected void initViews() {
        //初始化控件
        et_new_password = findViewById(R.id.et_new_password);
        et_confirm_password = findViewById(R.id.et_confirm_password);
    }

    @Override
    protected void setListener() {


        //返回
        findViewById(R.id.toolbar).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });


        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(2000);
                            finish();
                        } else {
                            Toast.makeText(UpdatePwdActivity.this, "修改失败", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }
        });

    }

    @Override
    protected void initData() {

    }
}

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

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

相关文章

【人工智能】线性回归

目录 一、使用正规化方法计算下列样本的预测函数 1. 没有归一化之前 2. 归一化之后 二、读取ex1data2.txt中的数据&#xff0c;建立样本集&#xff0c;使用正规化法获取&#xff08;房屋面积&#xff0c;房间数量&#xff09;与房屋价格间的预测函数 1. 读取数据&#xff…

【OpenCV】BGR三色通道的提取与合并--超详细解读

在OpenCV中&#xff0c;处理图像时经常需要提取或合并图像的RGB&#xff08;红、绿、蓝&#xff09;三色通道。OpenCV默认使用BGR&#xff08;蓝、绿、红&#xff09;顺序来存储图像的颜色通道&#xff0c;这一点与很多图像处理库&#xff08;如PIL/Pillow&#xff09;不同&…

【项目计划】软件项目计划(Word)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件资料清单列表部分文档&#xff1a; 工作安排任务书…

Renesas R7FA8D1BH (Cortex®-M85) 读取芯片内部温度值

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP和KEIL配置ADC 2.1 ADC硬件接口 2.2 FSP配置ADC 3 软件功能实现 3.1 FSP生成项目 3.2 FSP ADC模块库函数介绍 3.2.1 库函数列表 3.2.2 函数介绍 4 读Temperature sensor 4.1 初始化ADC…

Matlab-Simulink模型保存为图片的方法

有好多种办法将模型保存为图片&#xff0c;这里直接说经常用的 而且贴到Word文档中清晰、操作简单。 simulink自带有截图功能&#xff0c;这两种方法都可以保存模型图片。选择后直接就复制到截切板上了。直接去文档中粘贴就完事了。 这两个格式效果不太一样&#xff0c;第一种清…

麒麟系统开发笔记(十四):在国产麒麟系统上编译libmodbus库、搭建基础开发环境和移植测试Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140387947 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

多数元素-哈希表

169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 哈希表来找出这个数出现几次 class Solution { public:int majorityElement(vector<int>& nums) {unordered_map<int,int> counts;int cnt 0, majority 0;for(int num : nums){counts[num];if(counts…

Python写api程序批量自动抓取商品评论数据演示

要实现一个Python程序批量自动抓取商品评论数据&#xff0c;你可以使用requests库来发送HTTP请求&#xff0c;并使用BeautifulSoup库来解析HTML页面。以下是一个简单的示例&#xff1a; 首先&#xff0c;确保已经安装了所需的库&#xff1a; pip install requests pip instal…

【Python学习笔记】Optuna + Transformer B站视频实践

【Python学习笔记】Optuna Transformer 实践 背景前摇&#xff08;省流可不看&#xff09;&#xff1a; 之前以泰坦尼克号数据集为案例&#xff0c;学习了Optuna的基本操作&#xff0c;为了进一步巩固知识和便于包装简历&#xff0c;决定找个唬人一点的项目练练手。 ————…

《揭秘深度强化学习》:一本揭示AI前沿技术的必读书籍

在人工智能&#xff08;AI&#xff09;领域飞速发展的今天&#xff0c;深度强化学习作为一种革命性技术&#xff0c;正在改变我们的世界。今天要向大家推荐的是《揭秘深度强化学习》这本书&#xff0c;它不仅为读者提供了深度强化学习的全面指南&#xff0c;还揭示了这一技术的…

常用I/O复用模型 --> 一、单线程Accept(无IO复用)

文章目录 一、前言二、I/O复用中最基础的知识点1、流2、I/O操作3、阻塞等待4、非阻塞&#xff0c;忙轮询5、多路I/O复用 三、单线程Accept(无IO复用)1、服务端2、客户端 一、前言 单线程Accept(无IO复用)是网络最基础的模型&#xff0c;常供学习使用。 下面是我的GitHub仓库&…

韦东山嵌入式linux系列-驱动设计的思想(面向对象/分层/分离)

1 面向对象 字符设备驱动程序抽象出一个 file_operations 结构体&#xff1b; 我们写的程序针对硬件部分抽象出 led_operations 结构体。 2 分层 上下分层&#xff0c;比如我们前面写的 LED 驱动程序就分为 2 层&#xff1a; ① 上层实现硬件无关的操作&#xff0c;比如注册…

各种Attention|即插即用|适用于YoloV5、V7、V8、V9、V10(一)

摘要 本文总结了各种注意力&#xff0c;即插即用&#xff0c;方便大家将注意力加到自己的论文中。 SE import torch from torch import nn class SEAttention(nn.Module): """ SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;中的注意力…

浅析 VO、DTO、DO、PO 的概念

文章目录 I 浅析 VO、DTO、DO、PO1.1 概念1.2 模型1.3 VO与DTO的区别I 浅析 VO、DTO、DO、PO 1.1 概念 VO(View Object) 视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。DTO(Data Transfer Object): 数据传输对象,这个概念来源于J2EE的设…

Redis系列命令更新--Redis哈希命令

一、设置密码验证&#xff1a; 使用文本编辑器&#xff0c;这里使用Notepad&#xff0c;打开Redis服务配置文件。 注意&#xff1a;不要找错了&#xff0c;通常为redis.windows-service.conf&#xff0c;而不是redis.windows.conf。后者是以非系统服务方式启动程序使用的配置…

Gradle学习-6 APT 实现一个路由跳转框架(APT、发布maven仓库)

Annotation 注解&#xff1a;注解是元数据&#xff0c;即描述数据的数据APT&#xff08;Annotation Processing Tool&#xff09;注解处理器 APT工作原理 Demo介绍 APT项目地址 使用APT maven仓库地址 &#xff08;1&#xff09;项目配置 Gradle 8.2AGP 8.2.0Java jdk 17…

Python爬虫速成之路(2):爬天气情况

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

到底哪些牌子的鼠标好?选择鼠标需要注意哪些问题?

鼠标的选择从外观材质、手感、配置到价格定位都不尽相同&#xff0c;消费者的选择也越来越多。一般在选择鼠标时&#xff0c;我们也会发现鼠标能够选择的品牌虽然众多&#xff0c;但是不同品牌下的鼠标在品质和款式上都是大不相同的&#xff0c;那么到底哪些牌子的鼠标好呢?我…

黑马头条微服务学习day01-环境搭建、SpringCloud微服务(注册发现、网关)

文章目录 项目介绍环境搭建项目背景业务功能技术栈说明 nacos服务器环境准备nacos安装 初始工程搭建环境准备主体结构 app登录需求分析表结构分析手动加密微服务搭建接口定义功能实现登录功能实现 Swagger使用app端网关nginx配置 项目介绍 环境搭建 项目背景 业务功能 技术栈说…

11计算机视觉—语义分割与转置卷积

目录 1.语义分割应用语义分割和实例分割2.语义分割数据集:Pascal VOC2012 语义分割数据集预处理数据:我们使用图像增广中的随机裁剪,裁剪输入图像和标签的相同区域。3.转置卷积 上采样填充、步幅和多通道填充步幅多通道转置卷积是一种卷积:重新排列输入和核转置卷积是一种卷…