【1个月速成Java】基于Android平台开发个人记账app学习日记——第4天,注册登录逻辑代码

news2024/11/5 12:41:56

24.11.03

1.输入手机号跳转功能

第一个要设计的功能是,输入手机号以后跳转到另一个页面,输入获取得到的验证码页面。先拿这个功能练练手。

首先看一下此时的完整项目结构:

主要是添加了2个活动类和对应的界面,下面看详细的代码部分。

处理注册的逻辑代码RegisterActivity

package com.example.personalexpensetracker.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.personalexpensetracker.R;

public class RegisterActivity extends AppCompatActivity {

    // 声明用于存储界面组件的变量,分别对应手机号输入框、协议复选框和注册按钮。
    private EditText phoneEditText;
    private CheckBox agreeCheckBox;
    private Button registerButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 活动创建时调用,调用父类的 onCreate 方法并设置布局

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        // 使用 findViewById 方法获取布局中的组件实例。
        phoneEditText = findViewById(R.id.phoneEditText);
        agreeCheckBox = findViewById(R.id.agreeCheckBox);
        registerButton = findViewById(R.id.registerButton);

        // 为注册按钮设置点击事件监听器
        registerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String phone = phoneEditText.getText().toString();
                if (agreeCheckBox.isChecked()) {
                    Intent intent = new Intent(RegisterActivity.this, PasswordInputActivity.class);
                    intent.putExtra("phone", phone);  // 传递手机号到下一个activity
                    startActivity(intent);
                }
                else {
                    Toast.makeText(RegisterActivity.this, "请勾选协议", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

}

 处理密码输入和提交的PasswordInputActivity

package com.example.personalexpensetracker.ui.activity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.personalexpensetracker.R;

public class PasswordInputActivity extends AppCompatActivity {

    // 成员变量声明,2次输入的密码和提交按钮
    private EditText passwordEditText1;
    private EditText passwordEditText2;
    private Button submitButton;

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

        // 获取3个组件实例,通过layout的xml文件中组件的id
        passwordEditText1 = findViewById(R.id.passwordEditText1);
        passwordEditText2 = findViewById(R.id.passwordEditText2);
        submitButton = findViewById(R.id.submitButton);

        // 为提交按钮设置事件监听器
        submitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String password1 = passwordEditText1.getText().toString();
                String password2 = passwordEditText2.getText().toString();

                if (password1.equals(password2)) {
                    // 处理注册逻辑,例如保存用户信息
                    Toast.makeText(PasswordInputActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                    finish(); // 关闭当前活动
                } else {
                    Toast.makeText(PasswordInputActivity.this, "两次输入的密码不一致", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

注册活动类到AndroidManifest.xml中

这个主要是添加下面2行代码即可

<activity android:name=".ui.activity.RegisterActivity"/>
<activity android:name=".ui.activity.PasswordInputActivity"/>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">

    <application
            android:allowBackup="true"
            android:dataExtractionRules="@xml/data_extraction_rules"
            android:fullBackupContent="@xml/backup_rules"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.AppCompat.Light"
            tools:targetApi="31">
        <activity
                android:name=".ui.activity.MainActivity"
                android:exported="true"
                android:label="@string/app_name"
                android:theme="@style/Theme.PersonalExpenseTracker">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".ui.activity.RegisterActivity"/>
        <activity android:name=".ui.activity.PasswordInputActivity"/>

    </application>

</manifest>

注册界面与密码输入界面

查看下这2个界面的预览:

 接下来看看效果:

注册功能测试

到现在基本的开发流程就掌握了,接下来需要重新修改文件内容,对照市面上的app进行登录注册功能的开发。

2.完整注册功能开发

首先捋一遍思路:

  • 启动页面(Landing Page):
    • 显示应用Logo
    • 勾选用户协议和隐私协议的复选框
    • 选择登录方式的按钮
    • 当按钮被点击时弹出选项(微信登录和手机号登录)
  • 微信登录确认弹窗:
    • 弹出对话框,确认是否进行微信登录。
  • 手机号登录页面:
    • 输入手机号和密码的输入框
    • 勾选用户协议和隐私协议的复选框
    • 登录按钮
    • 找回密码和注册账号的链接
    • 其他方式登录的按钮(引导到微信登录)

这里涉及到几个页面,我们把上面的登录注册等页面忘记,重新开始设计。第一个是启动页面,这个是新用户第一次下载和退出登录以后打开看到的页面。提供2种登录方式,包括微信登录页面和手机号登录页面。这里就是2个页面。然后手机号登录页面还提供找回密码和手机号注册页面。手机号注册点击以后进入的是输入验证码页面,之后是设置密码页面。总结以下我们接下来需要设计的页面一共有7个页面:

1.启动页面

2.微信登录页面

3.手机号登录页面

4.找回密码页面

5.输入手机号页面

6.输入验证码页面

7.设置密码页面

接下来我们就围绕着7个页面和相互的逻辑代码进行开发。在这之前先讲一下如何调整app的图标,相信很多人对这个感兴趣。

app图标设计

首先手残党没有设计经验的,推荐在canva上设计,用一些ai设计的找到灵感后,在它上面对照实现:

设计完点击分享就可以下载成png图片。然后如何导入到我们的项目中呢?之前文章说过res下很多文件都是图标在不同设备上的,所以有一个官网可以帮我们把图标转变成不同设备上的图片,地址如下:https://icon.kitchen/i/H4sIAAAAAAAAA6tWKkvMKU0tVrKqVkpJLMoOyUjNTVWyKikqTa3VUcrNTynNAUlGKyXmpRTlZ6Yo6Shl5hcDyfLUJKXYWgA19PHYPwAAAA%3D%3Dicon-default.png?t=O83Ahttps://icon.kitchen/i/H4sIAAAAAAAAA6tWKkvMKU0tVrKqVkpJLMoOyUjNTVWyKikqTa3VUcrNTynNAUlGKyXmpRTlZ6Yo6Shl5hcDyfLUJKXYWgA19PHYPwAAAA%3D%3D只需要上传之前保存的png设计图片,就可以得到一个压缩包,里面就是我们需要的文件夹。

然后我们把文件夹替换一下即可,下面看看效果图:

篇幅所限,下篇文章见

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

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

相关文章

使用GraphQL构建现代API

使用GraphQL构建现代API GraphQL简介 安装GraphQL 使用npm安装GraphQL 使用Yarn安装GraphQL 创建GraphQL服务器 定义Schema 编写Resolver 查询数据 变更数据 使用Apollo Client GraphQL订阅 数据验证 错误处理 分页查询 拆分和组合Schema 总结 随着API的发展&#xff0c;传统…

炒到天价的数字头像如何用AI制作——教你用Midjourney轻松打造像素风NFT头像

​ ​ 近年来&#xff0c;NFT数字头像成了热门话题&#xff0c;许多以像素风格为主的头像被炒到天价&#xff0c;像最近比较火的星球兽头像。 它们之所以备受追捧&#xff0c;不仅是因为视觉风格独特&#xff0c;更是因其在NFT领域的稀缺性。 那如果想自己制作一个像素风头像…

网络层2--IP协议

目录 一、虚拟互连网络 二、IP地址 1、IP地址表示方法 2、IP地址分类 3、无分类编址CIDR &#xff08;1&#xff09;网络前缀 &#xff08;2&#xff09;地址块 、 地址掩码 4、IP地址特点 5、地址解析协议ARP &#xff08;1&#xff09;原理 &#xff08;2&#xf…

进程间通信(命名管道 共享内存)

文章目录 命名管道原理命令创建命名管道函数创建命名管道 共享内存原理shmgetFIOK 代码应用&#xff1a;premsnattch 命名管道 用于两个毫无关系的进程间的通信。 原理 Linux文件的路径是多叉树&#xff0c;故文件的路径是唯一的。 让内核缓冲区不用刷新到磁盘中&#xff0c…

基于SSM+小程序的计算机实验室排课与查询管理系统(实验室2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 1、管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;实验室信息管理&#xff0c;实验室预约管理&#xff0c;取消预约管理&#xff0c;实验课程管理&#xff0…

基于STM32的农业监测与管理系统设计思路介绍(代码示例)

一、项目概述 在全球农业现代化进程中&#xff0c;农业监测与管理系统的研发具有重要意义。本文介绍的基于STM32的农业监测与管理系统&#xff0c;旨在通过智能小车实现对农作物的环境监测、土壤检测等功能。该系统利用手势控制技术&#xff0c;农民可以通过简单的手势指令来操…

分布式架构搭建博客网站

目录 运行环境基础配置需求准备工作配置静态ip修改主机名及host映射开启防火墙时间同步配置免密ssh登录 环境搭建Server-Web端安装LNMP环境软件Server-NFS-DNS端上传博客软件Server-NFS-DNS端设置NFS共享Server-Web设置挂载远程共享目录nginx设置在数据库中创建数据库和用户重启…

基于Transformer的路径规划 - 第五篇 GPT生成策略_解码方法优化

上一篇&#xff1a;基于Transformer的路径规划 - 第四篇 GPT模型优化 在上一篇中&#xff0c;我尝试优化GPT路径生成模型&#xff0c;但没有成功。在随机生成的测试集上&#xff0c;路径规划成功率只有99%左右。而使用传统的路径规划算法&#xff0c;例如A*&#xff0c;路径规划…

【HarmonyOS】鸿蒙应用设置控件通用样式AttributeModifier, @Styles

【HarmonyOS】鸿蒙应用设置控件通用样式AttributeModifier&#xff0c; Styles 前言 在鸿蒙中UI开发经常需要对控件样式进行统一的封装&#xff0c;在API早前版本&#xff0c;一般是通过 Styles进行样式封装复用&#xff1a; Entry Component struct Index {build() {Column(…

[vulnhub]DC:7

https://www.vulnhub.com/entry/dc-7,356/ 端口扫描主机发现 探测存活主机&#xff0c;178是靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-03 13:30 CST Nmap scan report for 192.168.75.1 Host is up (0.00037s l…

鸿蒙HarmonyOS应用开发者(基础+高级)认证

文章目录 鸿蒙HarmonyOS应用开发者(基础高级)认证&#x1f449;1.HarmonyOS认证介绍1.1、HarmonyOS发展历程1.2、HarmonyOS NEXT 开发预览版1.3、ArkTS语言开发鸿蒙应用1.4、HarmonyOS应用开发者基础认证的核心内容1.5、HarmonyOS应用开发者高级认证的核心内容1.6、HarmonyOS应…

视频Qoe测量学习笔记(一)

目录 流媒体协议详解 RTSP&#xff1a;实时流式协议 RTCP&#xff1a;实时运输控制协议 RTP&#xff1a;实时运输协议 H.264 流媒体协议详解 RTSP&#xff1a;实时流式协议 由IETF MMusic小组开发&#xff0c;已成为互联网建议标准[RFC 2326]。RTSP本身并不传送数据&…

第三十三章 Vue路由进阶路由模块封装

目录 一、引言 二、完整代码 main.js index.js App.vue Find.vue My.vue 一、引言 在上一个章节中&#xff0c;我们将所有的路由配置都堆在main.js中来实现路径组件的路由&#xff0c;这样做的话非常不利于我们后期对项目的维护。因此正确的做法是将路由模块抽离出来&a…

用插值公式实现滚动进度条动画效果

我们在日常前端开发时在动画的选择上基本都是css&#xff0c;通过css的animation即可满足大部分的开发场景&#xff0c;如果遇到了特殊而比较不容易实现的效果就会考虑到用js来实现&#xff0c;而本次的主题&#xff0c;就是围绕用js来做一个比较不常见的特殊动画效果。 假设我…

【uni-app】创建自定义模板

1. 步骤 打开自定义模板文件夹 在此文件夹下创建模板文件&#xff08;注意后缀名&#xff09; 重新点击“新建页面” 即可看到新建的模板 2. 注意事项 创建的模板必须文件类型对应&#xff08;vue模板就创建*.vue文件, uvue模板就创建*.uvue文件&#xff09;

03哈希表算法/代码随想录

三、哈希表 有效的字母异位词 力扣242 这题是典型的哈希映射&#xff0c;只要将t存到哈希表中&#xff0c;key为t拆解的值&#xff0c;value为t中有过个key这样的值&#xff0c;然后在使用哈希表O&#xff08;1&#xff09;的时间复杂度判断 class Solution {public boolean …

下载安装COPT+如何在jupyter中使用(安装心得,windows,最新7.2版本)

目录 1.到杉树科技官网申请下载COPT 2.安装COPT&配置许可文件 3.在jupyter中使用COPT的python接口 最近看到一本和数学建模有关的新书&#xff1a;《数学建模与数学规划&#xff1a;方法、案例及编程实战》&#xff0c;作为数学建模老手&#xff0c;肯定要学习一下&…

【Linux】——操作系统-进程详解

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各…

Excel:vba实现批量插入图片批注

实现的效果&#xff1a;实现的代码如下&#xff1a; Sub InsertImageNamesAndPictures()Dim PicPath As StringDim PicName As StringDim PicFullPath As StringDim RowNum As IntegerDim Name As StringDim Comment As CommentDim folder As FileDialog 定义文件选择对话框 清…

HTML 语法规范——代码注释、缩进与格式、标签与属性、字符编码等

文章目录 一、代码注释1.1 使用注释的主要目的1.2 使用建议二、标签的使用2.1 开始标签和结束标签2.2 自闭合标签2.3 标签的嵌套2.4 标签的有效性三、属性四、缩进与格式4.1 一致的缩进4.2 元素单独占用一行4.3 嵌套元素的缩进4.4 避免冗长的行五、字符编码六、小结在开发 HTML…