文章目录

  • 手机号
  • 验证码
  • 密码

在我们的项目中,获取验证码、手机号验证以及密码输入是很常见的小功能。

手机号

1. 布局文件

<EditTextandroid:id="@+id/et_login_phone"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:background="@null"android:cursorVisible="true"android:hint="请输入手机号"android:inputType="phone"android:paddingLeft="10dp"android:paddingTop="10dp"android:paddingBottom="10dp"android:singleLine="true"android:textColor="@color/black"android:textColorHint="#999799"android:textSize="16sp" />

2. 校验手机号

 /*** 匹配手机号的规则:[356789]是手机号第二位可能出现的数字*/public static final String REGEX_MOBILE = "^[1][356789][0-9]{9}$";/*** 校验手机号* @param mobile* @return 校验通过返回true,否则返回false*/public static boolean isMobile(String mobile) {return Pattern.matches(REGEX_MOBILE, mobile);}

验证码

方式一
1.TimeCountDown.java

public class TimeCountDown extends AppCompatTextView {private static final String TAG = TimeCountDown.class.getSimpleName();private static final int COUNT_DOWN_START = 1;//开始计时private static final int COUNT_DOWN_LOADING = 2;//计数中private static final int COUNT_DOWN_FINISH = 3;//计数完成private static final int COUNT_DOWN_ERROR = 4;//计数出错/*** 倒计时时间为60 s*/private int countTime = 60;/*** 变量,用来计数当前倒计时的时间*/private int mCount;/*** 倒计时之前显示的文字*/private String beforeCount = "获取验证码";/*** 倒计时之后显示的文字*/private String afterCount = "秒";/*** handler*/private Handler mHandler;private Timer mTimer;private TimerTask mTimerTask;private OnTimerCountDownListener onTimerCountDownListener;public TimeCountDown(Context context) {super(context);init();}public TimeCountDown(Context context, AttributeSet attrs) {super(context, attrs);init();}public void init() {mCount = countTime;setText(beforeCount);mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case COUNT_DOWN_START:if (null != onTimerCountDownListener) {onTimerCountDownListener.onCountDownStart();}mCount--;break;case COUNT_DOWN_LOADING:if (null != onTimerCountDownListener) {onTimerCountDownListener.onCountDownLoading(mCount);}setText(msg.arg1 + afterCount);mCount--;break;case COUNT_DOWN_FINISH:if (null != onTimerCountDownListener) {onTimerCountDownListener.onCountDownFinish();}if (mCount < 0) {//当倒计时时间小于0后,取消计时任务mTimer.cancel();setText("重新获取");mCount = countTime;}break;case COUNT_DOWN_ERROR:if (null != onTimerCountDownListener) {onTimerCountDownListener.onCountDownError();}break;}}};}public void initTimer() {mTimer = new Timer();mTimerTask = new TimerTask() {@Overridepublic void run() {Log.d(TAG, "当前count:" + mCount);switch (mCount) {case 60:sendMessage(COUNT_DOWN_START, 0);break;case -1:sendMessage(COUNT_DOWN_FINISH, 0);break;default:sendMessage(COUNT_DOWN_LOADING, mCount);break;}}};//每隔1秒发送一次空消息mTimer.schedule(mTimerTask, 0, 1000);}private void sendMessage(int flag, int factor) {Message msg = new Message();switch (flag) {case COUNT_DOWN_ERROR:case COUNT_DOWN_FINISH:case COUNT_DOWN_START:break;case COUNT_DOWN_LOADING:// 计数中msg.arg1 = factor;break;default:break;}msg.what = flag;mHandler.sendMessage(msg);}//这个必须要写,在退出界面时,要取消计时任务,不然,会一直在计时,直到为0.public void cancel() {mTimer.cancel();}public void setOnTimerCountDownListener(OnTimerCountDownListener listener) {this.onTimerCountDownListener = listener;}public interface OnTimerCountDownListener {/*** 计时开始*/public void onCountDownStart();/*** 计时中*/public void onCountDownLoading(int currentCount);/*** 计时错误失败*/public void onCountDownError();/*** 计时完成*/public void onCountDownFinish();}
}

2.代码

/*** 已开通*/
@ActivityFragmentInject(contentViewId = R.layout.fragment_open,hasNavigationView = false)
public class OpenFragment extends BaseFragment implements TimeCountDown.OnTimerCountDownListener {private TimeCountDown countDown;@Overrideprotected void toHandleMessage(Message msg) {}@Overrideprotected void findViewAfterViewCreate() {countDown = (TimeCountDown) mRootView.findViewById(R.id.countdown);}@Overrideprotected void initDataAfterFindView() {countDown.setOnTimerCountDownListener(this);countDown.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {countDown.initTimer();}});}@Overridepublic void onCountDownStart() {}@Overridepublic void onCountDownLoading(int currentCount) {countDown.setClickable(false);}@Overridepublic void onCountDownError() {}@Overridepublic void onCountDownFinish() {countDown.setClickable(true);}@Overridepublic void onDestroy() {super.onDestroy();countDown.cancel();}
}

方式二

private void startTimer(final TextView smsCodeTv) {smsCodeTv.setTextColor(Color.parseColor("#a1a1a1"));smsCodeTv.setText("60s");smsCodeTv.setEnabled(false);new Thread() {@Overridepublic void run() {for (int i = 59;i >= 0;i--) {final int second = i;try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}runOnUiThread(new Runnable() {@Overridepublic void run() {if (second <= 0) {smsCodeTv.setTextColor(Color.parseColor("#fabf40"));smsCodeTv.setText("获取验证码");smsCodeTv.setEnabled(true);}else {smsCodeTv.setTextColor(Color.parseColor("#a1a1a1"));smsCodeTv.setText(second + " s");}}});}}}.start();}

密码

1. 布局文件

<?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"android:gravity="center"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:background="#11000000"android:gravity="center_vertical"android:orientation="horizontal"><EditTextandroid:id="@+id/edt_Pwd"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@null"android:hint="输入支付密码"android:inputType="textPassword"android:padding="10dp"android:paddingRight="10dp" /><ToggleButtonandroid:id="@+id/tb_show"android:layout_width="20dp"android:layout_height="20dp"android:layout_marginRight="10dp"android:background="@drawable/toggle_pwd_selector"android:padding="10dp"android:textOff=""android:textOn="" /></LinearLayout></LinearLayout>

toggle_pwd_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="true" android:drawable="@drawable/ic_pwd_select"/><item android:state_checkable="false" android:drawable="@drawable/ic_pwd_normal"/>
</selector>

2. 代码使用

public class MainActivity extends AppCompatActivity {private EditText mPwd;private ToggleButton mShowPwd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mPwd = findViewById(R.id.edt_Pwd);mShowPwd = findViewById(R.id.tb_show);mShowPwd.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {if (isChecked) {//如果选中,显示密码mPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());} else {//否则隐藏密码mPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());}}});}
}

Android 项目必备(十六)--> 手机号 验证码 密码相关推荐

  1. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十六(商品排序,Thymeleaf快速入门,商品详情页的展示)

    Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十六(商品详情页的展示) 一.商品排序 1.完善页面信息 这是用来做排序的,默认按照综合排序 ...

  2. 手把手教你搭建SpringCloud项目(十六)集成Stream消息驱动

    Spring Cloud全集文章目录: 零.什么是微服务?一看就会系列! 一.手把手教你搭建SpringCloud项目(一)图文详解,傻瓜式操作 二.手把手教你搭建SpringCloud项目(二)生产 ...

  3. 【android学习之十六】——特色功能1:GoogleMap手机地图

    声明:学习的书籍<Android应用开发揭秘>,这里记录学习该书籍的日志,引用的相关代码与总结描述,没有商业的用途,完全是自我学习的一个记录,刚刚学习不可避免会出现很多问题,若是有错误还请 ...

  4. 【ANDROID游戏开发十六】ANDROID GESTURE之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/337.html - ...

  5. 精通Android自定义View(十六)invalidate方法和requestLayout方法

    1 简述 requestLayout方法会导致View的onMeasure.onLayout.onDraw方法被调用:invalidate方法则只会导致View的onDraw方法被调用 2 reque ...

  6. Android进阶(二十六)MenuInflater实现菜单添加

    MenuInflater实现菜单添加 前言 之前实现的Android项目中可以实现菜单的显示.但是再次调试项目时发现此功能已无法实现,很是令人费解.难道是因为自己手机Android系统的问题?尝试通过 ...

  7. Android 项目必备(二十六)-->获取手机中所有 APP

    效果图 代码 添加依赖 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30' implementation ...

  8. Android 项目必备(三十八)-->APP 消息推送

    文章目录 前言 推送的实现方式 1. C2DM 2. 轮询 3. SMS信令推送 4. MQTT协议 5. XMPP协议 6. 使用第三方平台 Android 中 MQTT 的使用 1. 集成 2. ...

  9. Android 项目必备(二十九)-->App 在线升级与更新

    文章目录 前言 实战 前言 1. 用户使用 App 的时候升级提醒有两种方式获得: 通过应用市场获取: 打开应用之后提醒用户更新升级. 2. 更新操作一般是在用户点击了升级按钮之后开始执行的,这里的升 ...

最新文章

  1. 开坑,写点Polymer 1.0 教程第3篇——组件注册与创建
  2. HDU.4903.The only survival(组合 计数)
  3. _itemmod_day_limit
  4. 2021年下半年软考报考流程!
  5. C语言 ungetc将变量存放的字符返回给stdin输入流
  6. c语言中整型数组如何初始化,C语言数组空间的初始化详解
  7. ELK快速搭建一个集中化日志平台
  8. python 模块定义_在python中定义私有模块函数
  9. oppo9.0系统手机一键激活Xposed框架的步骤
  10. 如何汉化并编译 Python 源代码
  11. POI多个Sheet生成Excel
  12. 如何美化CheckBox
  13. leetcode寻找重复数
  14. wifidog 配置中文说明
  15. 高效能人士的七个习惯 与成功有约
  16. Bean对象的拷贝方法BeanCopier和BeanUtils
  17. PS学习笔记--操作篇
  18. hadoop distcp 参数调优_linux性能调优总结 - 星火撩原
  19. 易语言5.7完美版 全套视频学习教程
  20. ubuntu桌面美化mac_Ubuntu桌面美化(一)桌面美化成MacOS

热门文章

  1. Java使用FFmpeg处理视频文件的方法教程
  2. MySQL 使用命令行导出导出数据库、数据表、表结构
  3. mysql带中文日期转换_MySQL日期函数与日期转换格式化函数大全
  4. 小米电脑开机遇到No Bootable Device
  5. 如何成功的做好服务销售
  6. 今天10:00 | SCITIC 论坛:AAAI 2023预讲会开讲!
  7. SDU程序设计思维Week7-作业 C-TT的美梦
  8. linux软件包怎么管理,Linux之软件包管理
  9. 掉价最快的手机排行榜_手机降价排行榜
  10. Linux找回root用户密码