Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码)
整体的界面:
页面的布局:
功能介绍:
1:对账号密码的校验。
账号不为11位,密码不正确的时候提示对应的信息。
// 先去判断手机号码是否符合 if(phone.length()2:点击验证码登录时,显示不同的界面。
通过对RadioGroup设置监听
// 给 rg_login设置单选监听 rb_login.setOnCheckedChangeListener(this);通过获取 checkedId 就可以知道是 密码登录还是验证码登录,然后设置对应的文本内容就可以。
@Override public void onCheckedChanged(RadioGroup group, int checkedId) { // 选择的是 密码登录的方式 if(checkedId == R.id.rb_password) { tv_password.setText(getString(R.string.login_password)); et_password.setHint(getString(R.string.input_password)); btn_forget.setText(getString(R.string.forget_password)); ck_remember.setVisibility(View.VISIBLE); // 验证码登录的时候 要把记住密码这个给pass掉 String password = preferences.getString("password", "null"); if(!password.equals("null")) { et_password.setText(password); } } else if(checkedId == R.id.rb_verifycode) { // 选择的是 验证码的登录方式 tv_password.setText(getString(R.string.verifycode)); et_password.setHint(getString(R.string.input_verifycode)); et_password.setText(""); btn_forget.setText(getString(R.string.get_verifycode)); ck_remember.setVisibility(View.GONE); // 验证码登录的时候 要把记住密码这个给pass掉 } }3:忘记密码
点击忘记密码之后,首先校验的是你输入手机号没?要是没有手机号的话要做出提示。
用的是intent 指定要跳转的界面.class,可以在跳转的时候去携带指定的信息。
用intent.putExtra(key, value);
// 那么这里执行的是 此时要跳到找回密码页面 // 要去携带手机号码进行跳转 Intent intent = new Intent(this, LoginForgetActivity.class); intent.putExtra("phone", phone); register.launch(intent);对两次新密码一致性进行校验
4:生产随机的6位验证码
// 生成6位的随机验证码 verifyCode = String.format("%06d", new Random().nextInt(999999)); // 弹出对话框 提示用户 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("密码可以忘,但验证码不能忘"); builder.setMessage("本次验证码是" + verifyCode + ",请输入验证码"); builder.setPositiveButton("好的", null); AlertDialog dialog = builder.create(); dialog.show();找回密码后把数据带回到登录界面
finish() 表示这个界面的任务完成了,就可以回到之前调用我的那个界面了。
// 进行确认的操作 // 要去跳转到登录界面 然后填充具体的数据 // 进行相关操作后,设置返回结果 Intent resultIntent = new Intent(); Bundle bundle = new Bundle(); // 获取传入的 phone 数据 String phone = getIntent().getStringExtra("phone"); // 随便带回一个密码都可以 bundle.putString("password", et_password_first.getText().toString()); bundle.putString("phone", phone); resultIntent.putExtras(bundle); // "返回的数据" 替换为实际要返回的值 setResult(RESULT_OK, resultIntent); finish(); // 关闭 LoginForgetActivity 页面5:记住密码
输入正确的账号和密码,并点击记住密码之后,下一次再次登录的时候 就会把xml里面的文件给写到文本框里面。
preferences = getSharedPreferences("config", Context.MODE_PRIVATE);上面代码里面参数的介绍:
config: 表示的进行存储和读取的文件名称(后缀默认是 .xml),
Context.MODE_PRIVATE: 表示的是 私有的数据,不允许别人进行访问。
该文件的位置:/data/data/应用包名/shared_prefs/文件名.xml
通过Map(key, value)的形式进行存储的。
全部代码:
activity_login_main.xml:
LoginMainActivity.java
package com.findyou.myapplication; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import com.findyou.myapplication.util.ViewUtil; import java.util.ConcurrentModificationException; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * 模拟登录注册时候 * 1:账号密码登录 * 2:验证码登录 */ public class LoginMainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, View.OnClickListener { private TextView tv_password; private EditText et_password; private Button btn_forget; private CheckBox ck_remember; private EditText et_phone; private RadioButton rb_password; private RadioButton rb_verifycode; private ActivityResultLauncher register; private Button btn_login; // TODO: 这里的密码校验是写死的 后期要进行修改 private String mPassword = "666666"; private String verifyCode; private SharedPreferences preferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login_main); // 先去获取 按钮组的id RadioGroup rb_login = findViewById(R.id.rg_login); tv_password = findViewById(R.id.tv_password); et_password = findViewById(R.id.et_password); et_phone = findViewById(R.id.et_phone); // 按钮 btn_forget = findViewById(R.id.btn_forget); ck_remember = findViewById(R.id.ck_remember); rb_password = findViewById(R.id.rb_password); rb_verifycode = findViewById(R.id.rb_verifycode); btn_login = findViewById(R.id.btn_login); // 给 rg_login设置单选监听 rb_login.setOnCheckedChangeListener(this); et_phone.addTextChangedListener(new HideTextWatcher(et_phone, 11)); et_password.addTextChangedListener(new HideTextWatcher(et_password, 6)); btn_forget.setOnClickListener(this); register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override public void onActivityResult(ActivityResult result) { // 回来的时候就来到了这里 if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); if (data != null) { // 把带回来的账号和密码进行填充 Bundle extras = data.getExtras(); if (extras != null) { et_phone.setText(extras.getString("phone")); } if (extras != null) { et_password.setText(extras.getString("password")); } // 填充之后 要把带回来的密码设置为之前写死的那个 if (extras != null) { mPassword = extras.getString("password"); } Toast.makeText(LoginMainActivity.this, "找回密码成功, 快登录吧", Toast.LENGTH_SHORT).show(); } } } }); btn_login.setOnClickListener(this); // 一定要先进行初始化 // 初始化preferences preferences = getSharedPreferences("config", Context.MODE_PRIVATE); String remember = preferences.getString("rememberPassword", "null"); if(!remember.equals("null") && !remember.equals("false")) { // 要先看看有没有登录成功的时候 点击记住密码这个选项 reload(); } } /** * 获取自己的偏好 */ private void reload() { String phone = preferences.getString("phone", "null"); if(!phone.equals("null")) { et_phone.setText(phone); } String password = preferences.getString("password", "null"); if(!password.equals("null")) { et_password.setText(password); } String remember = preferences.getString("rememberPassword", "null"); if(!remember.equals("null")) { ck_remember.setChecked(Boolean.valueOf(remember)); } } @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // 选择的是 密码登录的方式 if(checkedId == R.id.rb_password) { tv_password.setText(getString(R.string.login_password)); et_password.setHint(getString(R.string.input_password)); btn_forget.setText(getString(R.string.forget_password)); ck_remember.setVisibility(View.VISIBLE); // 验证码登录的时候 要把记住密码这个给pass掉 String password = preferences.getString("password", "null"); if(!password.equals("null")) { et_password.setText(password); } } else if(checkedId == R.id.rb_verifycode) { // 选择的是 验证码的登录方式 tv_password.setText(getString(R.string.verifycode)); et_password.setHint(getString(R.string.input_verifycode)); et_password.setText(""); btn_forget.setText(getString(R.string.get_verifycode)); ck_remember.setVisibility(View.GONE); // 验证码登录的时候 要把记住密码这个给pass掉 } } @Override public void onClick(View v) { String phone = et_phone.getText().toString(); if(v.getId() == R.id.btn_forget) { // 用户点击了 忘记密码这个操作 // 先去判断手机号码是否符合 if(phone.length() { // 结束当前的页面 finish(); })); builder.setNegativeButton("我再看看", null); AlertDialog dialog = builder.create(); dialog.show(); // 登录成功要保存用户的数据到文件里面 Mapmp = messageToMap(); keepMessage(mp); } /** * 把信息转换为 Map * @return 转换后的Map集合 */ private Map messageToMap() { Mapmp = new HashMap(); mp.put("phone", et_phone.getText().toString()); mp.put("password", et_password.getText().toString()); mp.put("rememberPassword", String.valueOf(ck_remember.isChecked())); return mp; } /** * 把传来的Map信息 存储到文件里面 * @param mp 存储信息的Map集合 */ private void keepMessage(Map mp) { SharedPreferences.Editor editor = preferences.edit(); for (String key : mp.keySet()) { editor.putString(key, mp.get(key)); } // 提交 editor.commit(); } private class HideTextWatcher implements TextWatcher { private EditText mView; private int mMaxLength; public HideTextWatcher(EditText v, int maxLength) { mView = v; mMaxLength = maxLength; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if(s.toString().length() == mMaxLength) { // 隐藏软键盘 ViewUtil.hideOneInputMethod(LoginMainActivity.this, mView); } } } }activity_login_forget.xml
LoginForgetActivity.java
package com.findyou.myapplication; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import java.util.Random; public class LoginForgetActivity extends AppCompatActivity implements View.OnClickListener { private Button get_verifycode; private Button btn_confirm; private TextView et_password_first; private TextView et_password_second; private TextView et_verifycode; private String verifyCode; private ActivityResultLauncher register; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login_forget); // 文本框里面的内容 为了后面的获取 et_password_first = findViewById(R.id.et_password_first); et_password_second = findViewById(R.id.et_password_second); et_verifycode = findViewById(R.id.et_verifycode); // 获取按钮 为了后面的监听事件 get_verifycode = findViewById(R.id.get_verifycode); btn_confirm = findViewById(R.id.btn_confirm); // 设置监听事件 get_verifycode.setOnClickListener(this); btn_confirm.setOnClickListener(this); } @Override public void onClick(View v) { if(v.getId() == R.id.btn_confirm) { // 登录 确认 if(!checkPassword() || !checkVerifyCode()) { return; } // 进行确认的操作 // 要去跳转到登录界面 然后填充具体的数据 // 进行相关操作后,设置返回结果 Intent resultIntent = new Intent(); Bundle bundle = new Bundle(); // 获取传入的 phone 数据 String phone = getIntent().getStringExtra("phone"); // 随便带回一个密码都可以 bundle.putString("password", et_password_first.getText().toString()); bundle.putString("phone", phone); resultIntent.putExtras(bundle); // "返回的数据" 替换为实际要返回的值 setResult(RESULT_OK, resultIntent); finish(); // 关闭 LoginForgetActivity 页面 } else if(v.getId() == R.id.get_verifycode) { // 获取验证码 // 生成6位的随机验证码 verifyCode = String.format("%06d", new Random().nextInt(999999)); // 弹出对话框 提示用户 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("密码可以忘,但验证码不能忘"); builder.setMessage("本次验证码是" + verifyCode + ",请输入验证码"); builder.setPositiveButton("好的", null); AlertDialog dialog = builder.create(); dialog.show(); } } /** * 对验证码的校验 * @return * true 表示的是 校验正确 * false 表示的是 校验错误 */ private boolean checkVerifyCode() { String getVerifyCode = et_verifycode.getText().toString(); if(getVerifyCode.isEmpty()) { showMessage("验证码不可为空"); return false; } if(!getVerifyCode.equals(verifyCode)) { showMessage("验证码错误"); return false; } return true; } /** * 用来对密码的校验 * 调用它 然后根据返回值 来判断新密码的正确性 * @return true 表示的校验正确 false 表示的是校验错误 */ public boolean checkPassword() { String passwordFirst = et_password_first.getText().toString(); String passwordSecond = et_password_second.getText().toString(); if(passwordFirst == null || passwordSecond == null) { showMessage("请输入新密码"); return false; } if(!passwordFirst.equals(passwordSecond)) { showMessage("两次密码不一致"); return false; } return true; } /** * 提示用户具体的错误信息 * @param message 具体信息 */ public void showMessage(String message) { Toast.makeText(this,message, Toast.LENGTH_SHORT).show(); } }string.xml
Chapter5 密码登录 验证码登录 手机号码: 请输入手机号码 登录密码: 请输入密码 忘记密码 登 录 输入新密码 请输入新密码 确认新密码 请再次输入新密码 验证码: 请输入验证码 获取验证码 确 定 记住密码color.xml:
#FF000000 #FFFFFFFF #ccccccGitee源码(如果你感觉对你有帮助,就帮我star一下吧)
FindYou/移动开发
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。