下面是基于Android实战开发商城项目的登录、注册和首页的模块
- 三个页面模块的效果图。我们展示java代码,我相信xml代码大家都能是实现出来。如果有需要,可以私信,可以免费发送!
1、首页面
- 首页面功能需求:
1.提示框
2.继承登录页面的方法,使用了层次继承
3.返回登录页面
4.能够注销账号
代码如下:大家看注释即可看懂
package com.liujintao.day02_code.login;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.liujintao.day02_code.R;
import org.w3c.dom.Text;
/**
* 使用继承(多继承)实现了多个类的继承 AppCompatActivity LoginTest1 两个类
*/
public class HomeTest1 extends LoginTest1 implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_test1);
// 获取跳转至登录页面的图标
findViewById(R.id.home_go_login_button).setOnClickListener(this);
findViewById(R.id.father_id).setOnClickListener(this);
// 获取注销事件对象
findViewById(R.id.home_remove_id).setOnClickListener(this);
// 判断加载弹框
if (!LoginTest1.USERNAME.equals("") && !LoginTest1.PASSWORD.equals("")) {
handleToast("登陆成功!");
} else {
handleToast("点击右上角图标按钮,去登录!");
}
}
// 重写事件触发接口的抽象方法
public void onClick (View v) {
// 判断 id 来解决 传递过来需要触发那个事件
if (v.getId() == R.id.home_go_login_button) {
// 跳转登录页面
goActivity();
handleToast("需要先登录操作哦!");
}
if (v.getId() == R.id.father_id) {
handleToast("欢迎来到测试商城app(当前只是模拟测试),注意:每一次运行都需要进行注册登录!!!");
}
// 点击注销逻辑(如果用户触发了该事件,同时满足已经有注册过的情况下才能执行逻辑,一个为空则表示未注册过,何况登录过呢?)
if (v.getId() == R.id.home_remove_id && !LoginTest1.USERNAME.equals("") || !LoginTest1.PASSWORD.equals("")) {
LoginTest1.USERNAME = "";
LoginTest1.PASSWORD = "";
handleToast("账号注销成功!");
}
}
// 提示框
public void handleToast (String message) {
// 第一步: 创建弹框 → AlerDialog
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 第二步: 设置弹框标题和内容
builder.setTitle("提示!");
builder.setMessage(message);
// 第三步: 添加按钮并设置点击事件 → 该按钮是单框后用户触发的业务逻辑
builder.setPositiveButton("确定", (dialog, which) -> {
// 点击提示框确认后的处理逻辑
});
// 第四步: 显示弹框
builder.show();
}
// 页面跳转方法
public void goActivity() {
startActivity(new Intent(this, LoginTest1.class));
}
}
2、登录页面
- 登录页面功能需求:
- 首先是跳转,这里我们用到了Activity实现类进行跳转,这里可以擦参考我的Android专栏有关于Activity实现类 意图跳转的教程
- 我们采用模块化开发,对弹框、跳转页面、信息校验、Bundle数据打包解包等模块封装
- 实现用户点击的时候,校验判断是否允许符合要求的跳转,例如,输入为空则提示用户,密码错误同样的进行提示用户。
- 没有注册过的用户第一次必须进行注册。否则无法进行操作。
- 注重引导式用户开发。
- 接收登录页面打包过来的数据进行存储,主要用于校验用户输入的和他注册的信息是否效果匹配,不匹配要么错误,要么没注册过。
package com.liujintao.day02_code.login;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.liujintao.day02_code.R;
import java.util.ArrayList;
public class LoginTest1 extends AppCompatActivity implements View.OnClickListener{
// 存放账号或密码的数据容器,由注册页面打包获取。
protected static String USERNAME = "";
protected static String PASSWORD = "";
// 用户输入的信息
private String getNameString = "";
private String getPasswordString = "";
// 两个复选框
CheckBox cb1, cb2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_test1);
// 返回首页
findViewById(R.id.login_return_home_id).setOnClickListener(this);
// 获取登录按钮
findViewById(R.id.login_go_home_button).setOnClickListener(this);
// 获取注册按钮
findViewById(R.id.login_go_register_button).setOnClickListener(this);
// 获取记住密码复选框
cb1 = findViewById(R.id.login_remember_password);
cb1.setOnClickListener(this);
// 获取自动登录复选框
cb2 = findViewById(R.id.login_voluntarily);
cb2.setOnClickListener(this);
/**
* 获取用户注册的数据内容
*/
Bundle bundle = getIntent().getExtras();
// 判断传递过来是否有数据,没有数据则不执行,有数据则放行
if (bundle != null) {
// 将传递过来的包裹进行解包取出包裹
String getusername = bundle.getString("put_username");
String getpassword = bundle.getString("put_password");
// 注册打包过来的信息存放有效鉴权变量中
USERNAME = getusername;
PASSWORD = getpassword;
succeedToast();
}
// // 渲染视图
// if (!USERNAME.equals("") && !PASSWORD.equals("")) {
// rememberPasswordHandle();
// }
}
public void onClick (View v) {
// 返回首页
if (v.getId() == R.id.login_return_home_id) {
goActivityHome();
}
// 账号密码登录跳转首页
if (v.getId() == R.id.login_go_home_button) {
loginSucceedHandle();
}
// 点击跳转注册页面
if (v.getId() == R.id.login_go_register_button) {
goActivityRegister();
}
}
/**
* 登陆成功跳转逻辑
*/
private void loginSucceedHandle () {
// 获取账号密码信息,并且存进去
EditText n = findViewById(R.id.login_username_id);
this.getNameString = n.getText().toString();
EditText p = findViewById(R.id.login_password_id);
this.getPasswordString = p.getText().toString();
// 测试数据
Log.e("liu", "输入的账号为:" + this.getNameString);
Log.e("liu", "输入的账号为:" + this.getPasswordString);
/**
* 数据校验和Activity跳转到额处理逻辑
*/
if (getPasswordString.equals("") && getNameString.equals("")) {
handleToast("请将信息完善");
} else {
if (USERNAME.equals("") || PASSWORD.equals("")) {
handleToast("未注册哦!请先注册!");
} else {
if (USERNAME.equals(getNameString) && PASSWORD.equals(getPasswordString)) {
goActivityHome();
handleToast("登录成功!");
} else {
handleToast("账号或密码输入错误!");
}
}
}
}
/**
* 首页跳转
*/
private void goActivityHome () {
startActivity(new Intent(this, HomeTest1.class));
}
/**
* 注册页面跳转
*/
private void goActivityRegister () {
startActivity(new Intent(this, RegisterText1.class));
}
/**
* 提示框
*/
private void handleToast (String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示:");
builder.setMessage(message);
// Lambda表达式的写法替代实现类
builder.setPositiveButton("确定", (dialog, which) -> {
// 点击确定后需要触发的逻辑
});
builder.show();
}
/**
* 登录成功的提示框
*/
private void succeedToast () {
this.handleToast("快输入注册的信息登录吧!");
this.handleToast("恭喜你,注册成功!");
}
}
3、注册页面
- 注册页面功能实现
- 获取用户输入的信息
- 校验用户是否已经存在,符合注册要求
- 若是符合要求,则将数据打包传递给 login 登录页面,进行存储,方便用户登录。
package com.liujintao.day02_code.login;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import com.liujintao.day02_code.R;
public class RegisterText1 extends AppCompatActivity implements View.OnClickListener {
private String userName;
private String passWord;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register_text1);
// 获取返回登录页图标和注册按钮
findViewById(R.id.register_left_button).setOnClickListener(this);
findViewById(R.id.register_button_id).setOnClickListener(this);
}
public void onClick (View v) {
if (v.getId() == R.id.register_left_button) {
RegisterGoActivity();
}
if (v.getId() == R.id.register_button_id) {
EditText username = findViewById(R.id.register_input_username);
EditText password = findViewById(R.id.register_inpout_password);
userName = username.getText().toString();
passWord = password.getText().toString();
Log.e("liu", "username" + userName );
Log.e("liu", "password" + passWord );
if (userName.equals("") && passWord.equals("")) {
RegisterhandleToast("请将信息完善后进行注册哦!");
} else {
LoginTest1 login = new LoginTest1();
if (login.USERNAME.equals(userName)) {
RegisterhandleToast("手机号或用户名已经存在,请重新输入注册!");
username.setText("");
password.setText("");
} else {
// 打包数据给登录页面
Intent intent = new Intent(this, LoginTest1.class);
Bundle bundle = new Bundle();
bundle.putString("put_username", userName);
bundle.putString("put_password", passWord );
intent.putExtras(bundle);
startActivity(intent);
finish();
}
}
}
}
public void RegisterGoActivity () {
startActivity(new Intent(this, LoginTest1.class));
}
// 提示框
/**
* 提示框
*/
public void RegisterhandleToast (String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示:");
builder.setMessage(message);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick (DialogInterface dialog, int which) {
// 点击确定后需要触发的逻辑
}
});
builder.show();
}
}
4、注意
- 由于此时此刻正在备赛,所以发布的比较马虎,有需要源码的私信。免费发送。方便参考。