Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码)

06-01 1433阅读

整体的界面:

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码)

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码)

页面的布局:

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码)

功能介绍:

1:对账号密码的校验。

账号不为11位,密码不正确的时候提示对应的信息。

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码)

// 先去判断手机号码是否符合
            if(phone.length()  

2:点击验证码登录时,显示不同的界面。

通过对RadioGroup设置监听

 // 给 rg_login设置单选监听
 rb_login.setOnCheckedChangeListener(this);

通过获取 checkedId 就可以知道是 密码登录还是验证码登录,然后设置对应的文本内容就可以。

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码) 

 @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:忘记密码

 Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码)

点击忘记密码之后,首先校验的是你输入手机号没?要是没有手机号的话要做出提示。

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码)

用的是intent 指定要跳转的界面.class,可以在跳转的时候去携带指定的信息。

用intent.putExtra(key, value);

 // 那么这里执行的是 此时要跳到找回密码页面
                // 要去携带手机号码进行跳转
                Intent intent = new Intent(this, LoginForgetActivity.class);
                intent.putExtra("phone", phone);
                register.launch(intent);

对两次新密码一致性进行校验

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码) 

4:生产随机的6位验证码

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码) 

 // 生成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();

找回密码后把数据带回到登录界面

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码) 

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里面的文件给写到文本框里面。

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码) 

 preferences = getSharedPreferences("config", Context.MODE_PRIVATE);

上面代码里面参数的介绍:

config: 表示的进行存储和读取的文件名称(后缀默认是 .xml),

Context.MODE_PRIVATE: 表示的是 私有的数据,不允许别人进行访问。

该文件的位置:/data/data/应用包名/shared_prefs/文件名.xml

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码)

通过Map(key, value)的形式进行存储的。 

Android学习之登录界面(包含忘记密码 && 记住密码)(java + 详细注释 + 源码) 

全部代码:

 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
    
    #cccccc

Gitee源码(如果你感觉对你有帮助,就帮我star一下吧) 

FindYou/移动开发 

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码