一、需求



二、代码实现

资源文件
drawable/editext_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_focused="true" android:drawable="@drawable/shape_edit_focus"/><item android:drawable="@drawable/shape_edit_normal"/>
</selector>

values/strings.xml

<resources><string name="app_name">middlewidget</string><string name="title_activity_drawable_state">DrawableStateActivity</string><string name="prompt_email">Email</string><string name="prompt_password">Password</string><string name="action_sign_in">Sign in or register</string><string name="action_sign_in_short">Sign in</string><string name="welcome">"Welcome !"</string><string name="invalid_username">Not a valid username</string><string name="invalid_password">Password must be >5 characters</string><string name="login_failed">"Login failed"</string><!--自定义--><string name="login_by_password">密码登录</string><string name="login_by_verifycode">验证码登录</string><string name="phone_number">手机号码:</string><string name="input_phone_number">请输入手机号码</string><string name="login_password">登录密码:</string><string name="input_password">请输入密码</string><string name="forget_password">忘记密码</string><string name="remember_password">记住密码</string><string name="login">登      录</string><string name="input_new_password">输入新密码:</string><string name="input_new_password_hint">请输入新密码</string><string name="confirm_new_password">确认新密码:</string><string name="input_new_password_again">请再次输入新密码</string><string name="verifycode">    验证码:</string><string name="verifycode2">        验证码:</string><string name="input_verifycode">请输入验证码</string><string name="get_verfycode">获取验证码</string><string name="done">确      定</string>
</resources>

values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="purple_200">#FFBB86FC</color><color name="purple_500">#FF6200EE</color><color name="purple_700">#FF3700B3</color><color name="teal_200">#FF03DAC5</color><color name="teal_700">#FF018786</color><color name="black">#FF000000</color><color name="white">#FFFFFFFF</color><!--    自定义--><color name="grey">#cccccc</color>
</resources>

values/dimens.xml

<resources><!-- Default screen margins, per the Android Design guidelines. --><dimen name="activity_horizontal_margin">16dp</dimen><dimen name="activity_vertical_margin">16dp</dimen><dimen name="common_font_size">17sp</dimen><dimen name="button_font_size">20sp</dimen><dimen name="item_layout_height">50sp</dimen>
</resources>

布局文件:

layout/activity_login_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RadioGroupandroid:id="@+id/rg_login"android:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"android:orientation="horizontal"><RadioButtonandroid:id="@+id/rb_password"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:checked="true"android:text="@string/login_by_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size" /><RadioButtonandroid:id="@+id/rb_verifycode"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:text="@string/login_by_verifycode"android:textColor="@color/black"android:textSize="@dimen/common_font_size" />
</RadioGroup><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/phone_number"android:textColor="@color/black"android:textSize="@dimen/common_font_size" /><EditTextandroid:id="@+id/et_phone"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:background="@drawable/editext_selector"android:hint="@string/input_phone_number"android:inputType="number"android:maxLength="11"android:textColor="@color/black"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_password"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/login_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size" /><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><EditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:background="@drawable/editext_selector"android:hint="@string/input_password"android:inputType="numberPassword"android:maxLength="6"android:textColor="@color/black"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size" /><Buttonandroid:id="@+id/btn_forget"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_alignParentEnd="true"android:text="@string/forget_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size" /></RelativeLayout></LinearLayout><CheckBoxandroid:id="@+id/ck_remember"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/remember_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size"android:button="@drawable/checkbox_selector"/><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/login"android:textColor="@color/black"android:textSize="@dimen/button_font_size"/>

此布局文件对应的activity com/example/middlewidget/LoginForgetActivty.java

public class LoginForgetActivty extends AppCompatActivity implements View.OnClickListener, View.OnFocusChangeListener {private String mPhone;private String mRandomVerifyCode;private EditText et_verifycode;private EditText et_password_first;private EditText et_password_second;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login_forget_activty);// 从上一个页面获取要修改密码的手机号码Intent intent = getIntent();mPhone = intent.getStringExtra("phone");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);// 文本内容监听et_password_first.addTextChangedListener(new PasswordWatcher(et_password_first, 6));et_password_second.addTextChangedListener(new PasswordWatcher(et_password_second, 6));et_password_first.setOnFocusChangeListener(this);et_password_second.setOnFocusChangeListener(this);findViewById(R.id.btn_verifycode).setOnClickListener(this);findViewById(R.id.btn_confirm).setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {// 点击了获取验证码按钮case R.id.btn_verifycode:mRandomVerifyCode = String.format("%06d", new Random().nextInt(999999));AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle(getString(R.string.verifycode));builder.setMessage("你的是手机号" + mPhone + "本次的验证码是" + mRandomVerifyCode + ",请记住验证码");builder.setPositiveButton("我记住了", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 点击后自动将验证码填入验证码框et_verifycode.setText(mRandomVerifyCode);}});AlertDialog alertDialog = builder.create();alertDialog.show();break;// 点击了确定按钮case R.id.btn_confirm:String first_password = et_password_first.getText().toString();String second_password = et_password_second.getText().toString();if (first_password.length() < 6) {Toast.makeText(this, "请输入6位密码", Toast.LENGTH_SHORT).show();}if (!first_password.equals(second_password)) {Toast.makeText(this, "两次输入密码不相等,请重新输入", Toast.LENGTH_SHORT).show();return;}String verifyCode = et_verifycode.getText().toString();if (!verifyCode.equals(mRandomVerifyCode)) {Toast.makeText(this, "请输入正确的验证码", Toast.LENGTH_SHORT).show();return;}Toast.makeText(this, "密码修改成功", Toast.LENGTH_SHORT).show();// 以下把修改好的新密码返回给上一个密码Intent intent = new Intent();intent.putExtra("new_password", first_password);setResult(Activity.RESULT_OK, intent);finish();break;}}@Overridepublic void onFocusChange(View v, boolean hasFocus) {if (hasFocus) {String first_password = et_password_first.getText().toString();if (TextUtils.isEmpty(first_password) || first_password.length() < 6) {et_password_first.requestFocus();Toast.makeText(this, "请输入6位密码", Toast.LENGTH_SHORT).show();}}}private class PasswordWatcher implements TextWatcher {private EditText editText;private int mMaxLength;public PasswordWatcher(EditText editText, int maxLength) {this.editText = editText;this.mMaxLength = maxLength;}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {String str = s.toString();if (str.length() == mMaxLength) {ViewUtil.hideOneInputMethod(LoginForgetActivty.this, editText);}}}
}

第二个布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".LoginMainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/input_new_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size" /><EditTextandroid:id="@+id/et_password_first"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:background="@drawable/editext_selector"android:hint="@string/input_new_password"android:inputType="numberPassword"android:maxLength="6"android:textColor="@color/black"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/confirm_new_password"android:textColor="@color/black"android:textSize="@dimen/common_font_size" /><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><EditTextandroid:id="@+id/et_password_second"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:background="@drawable/editext_selector"android:hint="@string/input_new_password_again"android:inputType="numberPassword"android:maxLength="6"android:textColor="@color/black"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size" /></RelativeLayout></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/item_layout_height"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="@string/verifycode2"android:textColor="@color/black"android:textSize="@dimen/common_font_size" /><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><EditTextandroid:id="@+id/et_verifycode"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:background="@drawable/editext_selector"android:hint="@string/input_verifycode"android:inputType="number"android:maxLength="6"android:textColor="@color/black"android:textColorHint="@color/grey"android:textSize="@dimen/common_font_size" /><Buttonandroid:id="@+id/btn_verifycode"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_alignParentEnd="true"android:text="@string/get_verfycode"android:textColor="@color/black"android:textSize="@dimen/common_font_size" /></RelativeLayout></LinearLayout><Buttonandroid:id="@+id/btn_confirm"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/done"android:textColor="@color/black"android:textSize="@dimen/button_font_size"/></LinearLayout>

此布局对应的activity

public class LoginForgetActivty extends AppCompatActivity implements View.OnClickListener, View.OnFocusChangeListener {private String mPhone;private String mRandomVerifyCode;private EditText et_verifycode;private EditText et_password_first;private EditText et_password_second;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login_forget_activty);// 从上一个页面获取要修改密码的手机号码Intent intent = getIntent();mPhone = intent.getStringExtra("phone");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);// 文本内容监听et_password_first.addTextChangedListener(new PasswordWatcher(et_password_first, 6));et_password_second.addTextChangedListener(new PasswordWatcher(et_password_second, 6));et_password_first.setOnFocusChangeListener(this);et_password_second.setOnFocusChangeListener(this);findViewById(R.id.btn_verifycode).setOnClickListener(this);findViewById(R.id.btn_confirm).setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {// 点击了获取验证码按钮case R.id.btn_verifycode:mRandomVerifyCode = String.format("%06d", new Random().nextInt(999999));AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle(getString(R.string.verifycode));builder.setMessage("你的是手机号" + mPhone + "本次的验证码是" + mRandomVerifyCode + ",请记住验证码");builder.setPositiveButton("我记住了", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 点击后自动将验证码填入验证码框et_verifycode.setText(mRandomVerifyCode);}});AlertDialog alertDialog = builder.create();alertDialog.show();break;// 点击了确定按钮case R.id.btn_confirm:String first_password = et_password_first.getText().toString();String second_password = et_password_second.getText().toString();if (first_password.length() < 6) {Toast.makeText(this, "请输入6位密码", Toast.LENGTH_SHORT).show();}if (!first_password.equals(second_password)) {Toast.makeText(this, "两次输入密码不相等,请重新输入", Toast.LENGTH_SHORT).show();return;}String verifyCode = et_verifycode.getText().toString();if (!verifyCode.equals(mRandomVerifyCode)) {Toast.makeText(this, "请输入正确的验证码", Toast.LENGTH_SHORT).show();return;}Toast.makeText(this, "密码修改成功", Toast.LENGTH_SHORT).show();// 以下把修改好的新密码返回给上一个密码Intent intent = new Intent();intent.putExtra("new_password", first_password);setResult(Activity.RESULT_OK, intent);finish();break;}}@Overridepublic void onFocusChange(View v, boolean hasFocus) {if (hasFocus) {String first_password = et_password_first.getText().toString();if (TextUtils.isEmpty(first_password) || first_password.length() < 6) {et_password_first.requestFocus();Toast.makeText(this, "请输入6位密码", Toast.LENGTH_SHORT).show();}}}private class PasswordWatcher implements TextWatcher {private EditText editText;private int mMaxLength;public PasswordWatcher(EditText editText, int maxLength) {this.editText = editText;this.mMaxLength = maxLength;}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {String str = s.toString();if (str.length() == mMaxLength) {ViewUtil.hideOneInputMethod(LoginForgetActivty.this, editText);}}}
}

Android实战-找回密码相关推荐

  1. Android实战-忘记密码案例

    需求描述 各家电商App的登陆页面大同小异,要么是用户名与密码组合等等,要么是手机号码和验证码组合登录,若是做好一点的,则会提供找回密码与记住密码功能.先来看一下登录页面是什么样,因为有两种组合登陆方 ...

  2. android 手机找回密码,如何使用android手机找回以前使用的无线密码

    Android系统的系统文件夹会记录下曾经使用过的wifi账号和密码,安装RE管理器,在手机获得Root权限后就能在"data/misc/wifi"目录下找到"wpa_s ...

  3. 仿 手机QQ 登录、注册、找回密码、好友列表、QQ状态等功能的实现

    仿 手机QQ 登录.注册.找回密码.好友列表.QQ状态等功能的实现 全文 图 + 代码 .... 福利!!!(QQ登录背景,过度页面背景) 1.加载过程中的背景 2.登录页面 ==1. 登录页面 布局 ...

  4. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——实战二:简易登录+找回密码

    在移动互联网时代,用户是每家IT企业最宝贵的资源,对于App而言,吸引用户注册并登录是万分紧要之事,因为用户登录之后才有机会产生商品交易.登录校验通常是用户名+密码组合,可是每天总有部分用户忘记密码, ...

  5. android找回密码界面的代码,《Android项目实战-博学谷》设置密保找回密码

    设置密保&找回密码界面 思路 由于设置密保和找回密码两个界面十分相似,代码逻辑也十分相似,因此这两个界面可以使用同一个布局文件和同一个 Activity 来处理,首先导入所需图片资源文件,再创 ...

  6. Android 实战项目 -- 登录主页、找回密码

    分析 登录方式 用户名与密码组合登录 手机号与验证码组合登录 以上登录方式的区别 密码输入框和验证码输入框的左侧标题以及输入框内部的提示语各不相同 如果是密码登录,则需要支持找回密码:如果是验证码登录 ...

  7. Android基于Bmob后端云实现注册、登陆、找回密码、短信验证码

    注重版权,转载请注明原作者和原文链接 作者:Bald programmer 文章目录 整体功能展示 创建应用 配置Bmob 前期准备 一.数据表 二.工具类 代码设计 一.注册模块 二.登陆模块 三. ...

  8. android studio忘记密码界面,AndroidStudio制作“我”的界面,设置,修改密码,设置密保和找回密码...

    前言 大家好,我是 Vic,今天给大家带来AndroidStudio制作"我"的界面,设置,修改密码,设置密保和找回密码的概述,希望你们喜欢 学习目标 掌握修改密码功能的开发,和实 ...

  9. AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码

    AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . git源码:https://github.com/shenniubuxing3/LovePicture.Web . AspNetC ...

  10. java 注册忘记密码操作_Java实战项目(1):swing图书管理系统的登录,注册,找回密码,增删查,个人解析等...

    SQL部分: drop table yonghu, shangpin,dingdanxiangqing,sp_Type drop table shangpin select * from yonghu ...

最新文章

  1. SQL Server Profiler工具
  2. μCos-ii学习笔记1_概述
  3. ceph集群简单安装部署(Ubuntu14环境)
  4. 大数据与数据挖掘考试题_2017-2019年全国Ⅱ卷高考考点数据分析(理综合)
  5. 对比学习:充分利用有限的医学标注数据 |NeurIPS 2020
  6. 【Linux】Linux 生成证书 keytool 命令找不到
  7. Git系列(七):使用Git管理二进制大对象
  8. Tricks(二十五)—— decorator(在函数调用前后打印日志)
  9. java的GUI之SWT框架 配置开发环境(包含但不限于WindowBuilder完整教程,解决Unknown GUI toolkit报错,解决导入SWT包错误)...
  10. revit2016与2017区别_Revit2016版与Revit2018版的区别?
  11. 用matlab实现灰色预测gm11模型,用MATLAB实现灰色预测GM11模型
  12. jQuery实现鼠标滑过图片放大效果
  13. python分析《水浒传》小说,对文本数据内容清洗、分词、统计、词云可视化展示
  14. 计算机总自动开机 如何关闭,手把手教你win10电脑关机后自动开机怎么解决
  15. 【Mysql】留存率指标计算
  16. Pandas 报错:index must be monotonic increasing or decreasing
  17. java 未读消息_javaweb未读消息提醒
  18. 【操作系统知识】段页式存储管理
  19. linux查看docker是否启动命令行,如何通过命令行查看docker服务是否已启动
  20. 覃超数据结构(三)优先队列

热门文章

  1. 李践版 绩效能力日志
  2. IT行业最赚钱的5个职位
  3. anaconda创建虚拟环境并配置
  4. 在idea里写了点代码实现自动可定义次数发送jpg等文件给自己的好友,简单运行、再按下Ctrl+V+Enter
  5. 研发黄河千年清一回超高压龙卷风水盾构大国重器
  6. opencv 4.5.5 GStreamer warning: Error pushing buffer to GStreamer pipel
  7. PTA L1-087 机工士姆斯塔迪奥 C语言
  8. linux 信箱文件在哪里,Linux上無毒信箱的建立
  9. 商城项目实战23:KindEditor富文本编辑器的使用
  10. 6XV1830-0EH10