Android实现常见的验证码输入框实例代码

发布时间 - 2026-01-11 03:11:16    点击率:

前言

验证码输入框是很多APP必不可少的组件,之前在重构注册登录页面的时候,重新设计了UI,所以不能再简单的用EditText来做了,所以这篇文章将分享一下如何实现一个常见的验证码输入框。下面话不多说了,来一起看看详细的介绍吧。

正文

先搂一眼效果吧

不要把注意力都放在头顶的那一抹绿上,重点在输入框,可能大多数APP里都是采用6个方框的UI效果,我这里是按照我们设计的要求,用6根横线来划出6个数字的位置。一开始我想的是直接用6个TextView,然后传递焦点的做法,但是发现实现起来有一定的难度。又在网上查了一下,发现比较靠谱的办法是用6个TextView加一个EditText来实现,也按照这个方法去实现了,但是后来在测试的时候就发现了问题:网上给出的实现方式需要监听软键盘的删除按钮

editText.setOnKeyListener(new OnKeyListener() {
   @Override
   public boolean onKey(View v, int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DEL
      && event.getAction() == KeyEvent.ACTION_DOWN) {
     //TODO:
     return true;
    }
    return false;
   }
  });

这是一个大家熟知的写法,但是这个监听的方法其实并不靠谱(在安卓原生键盘上就监听不到),因为这个监听是否触发,并没有强制的要求,全看输入法开发者的心情,这是官方文档中的描述:

Key presses in software keyboards will generally NOT trigger this method, although some may elect to do so in some situations.

只能输入,不能删除,这可不行啊,用户肯定会骂娘的,我可不想被拿去去祭天什么的...

于是乎只能想办法在原有的基础上做一些修改,来规避这个问题,最后采用的方案是:采用一个TextView的数组来维护6个TextView,然后藏一个透明的EditTextView在后面用于接收用户输入的内容,再把输入的内容展示到6个TextView上就行了,UI什么的可以自己随意设计。在实现的过程中,遇到的一个关键问题就是:当输入的内容超过6位以后我该如何处理?一开始的方案是通过判断当前输入的位数然后再做相应的处理,网上的方案也是这么实现的,我后来一想,根本用不着这么麻烦,只需要一行属性就能解决这个问题:

android:maxLength="6"

只需要在EditText的属性里限制它的最大长度,就不用再去代码里做处理了,直接把EditTextView里的内容完全照搬到TextView上就可以了。

最终的完整代码如下:

public class VerifyCodeView extends RelativeLayout {
 private EditText editText;
 private TextView[] textViews;
 private static int MAX = 6;
 private String inputContent;

 public VerifyCodeView(Context context) {
  this(context, null);
 }

 public VerifyCodeView(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
 }

 public VerifyCodeView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  View.inflate(context, R.layout.view_verify_code, this);

  textViews = new TextView[MAX];
  textViews[0] = (TextView) findViewById(R.id.item_code_iv0);
  textViews[1] = (TextView) findViewById(R.id.item_code_iv1);
  textViews[2] = (TextView) findViewById(R.id.item_code_iv2);
  textViews[3] = (TextView) findViewById(R.id.item_code_iv3);
  textViews[4] = (TextView) findViewById(R.id.item_code_iv4);
  textViews[5] = (TextView) findViewById(R.id.item_code_iv5);
  editText = (EditText) findViewById(R.id.item_edittext);

  editText.setCursorVisible(false);//隐藏光标
  setEditTextListener();
 }

 private void setEditTextListener() {
  editText.addTextChangedListener(new TextWatcher() {

   @Override
   public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

   }

   @Override
   public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

   }

   @Override
   public void afterTextChanged(Editable editable) {
    inputContent = editText.getText().toString();

    if (inputCompleteListener != null) {
     if (inputContent.length() >= MAX) {
      inputCompleteListener.inputComplete();
     } else {
      inputCompleteListener.invalidContent();
     }
    }

    for (int i = 0; i < MAX; i++) {
     if (i < inputContent.length()) {
      textViews[i].setText(String.valueOf(inputContent.charAt(i)));
     } else {
      textViews[i].setText("");
     }
    }
   }
  });
 }


 private InputCompleteListener inputCompleteListener;

 public void setInputCompleteListener(InputCompleteListener inputCompleteListener) {
  this.inputCompleteListener = inputCompleteListener;
 }

 public interface InputCompleteListener {

  void inputComplete();

  void invalidContent();
 }

 public String getEditContent() {
  return inputContent;
 }

}

如果需要完整的demo,可以访问我的github:https://github.com/jb274585381/VerifyCodeViewDemo,当然大家也可以直接本地下载。

总结

有时候我们实现一个需求,不光要考虑最终的效果,还要考虑时间成本,能用最简单的方法实现当然是最好的,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


# 验证码输入框  # android  # 输入框样式  # 5种方法完美解决android软键盘挡住输入框方法详解  # Android高级xml布局之输入框EditText设计  # Android文本输入框(EditText)输入密码时显示与隐藏  # Android实现动态显示或隐藏密码输入框的内容  # 解决Android软键盘弹出覆盖h5页面输入框问题  # Android软键盘挡住输入框的终极解决方案  # Android仿支付宝自定义密码输入框及安全键盘(密码键盘)  # Android 自定义密码输入框实现代码  # Android UI设计系列之自定义EditText实现带清除功能的输入框(3)  # Android自定义九宫格输入框  # 输入框  # 有一定  # 这篇文章  # 验证码  # 的是  # 都是  # 这是  # 我想  # 放在  # 本地下载  # 就能  # 说了  # 不多  # 网上  # 只需  # 这个问题  # 要在  # 这是一个  # 要把  # 我可 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  什么是javascript作用域_全局和局部作用域有什么区别?  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  济南网站建设制作公司,室内设计网站一般都有哪些功能?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  如何正确选择百度移动适配建站域名?  JavaScript常见的五种数组去重的方式  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何在IIS7中新建站点?详细步骤解析  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  微信小程序 五星评分(包括半颗星评分)实例代码  Swift开发中switch语句值绑定模式  bootstrap日历插件datetimepicker使用方法  Laravel如何实现API资源集合?(Resource Collection教程)  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  如何批量查询域名的建站时间记录?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  如何在橙子建站上传落地页?操作指南详解  如何在Windows服务器上快速搭建网站?  海南网站制作公司有哪些,海口网是哪家的?  JavaScript实现Fly Bird小游戏  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel怎么在Controller之外的地方验证数据  Android实现代码画虚线边框背景效果  如何在建站之星绑定自定义域名?  如何在橙子建站中快速调整背景颜色?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  浅述节点的创建及常见功能的实现  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  Laravel如何使用Service Container和依赖注入?(代码示例)  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何用景安虚拟主机手机版绑定域名建站?  如何在搬瓦工VPS快速搭建网站?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  大型企业网站制作流程,做网站需要注册公司吗?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件