1. package com.loaderman.securitycodedemo;
  2.  
  3. import android.graphics.Color;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.widget.TextView;
  7. import android.widget.Toast;
  8.  
  9. public class MainActivity extends AppCompatActivity implements SecurityCodeView.InputCompleteListener {
  10.  
  11. private SecurityCodeView editText;
  12. private TextView text;
  13.  
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18.  
  19. findViews();
  20. setListener();
  21. }
  22.  
  23. private void setListener() {
  24. editText.setInputCompleteListener(this);
  25. }
  26.  
  27. private void findViews() {
  28. editText = (SecurityCodeView) findViewById(R.id.scv_edittext);
  29. text = (TextView) findViewById(R.id.tv_text);
  30. }
  31.  
  32. @Override
  33. public void inputComplete() {
  34. Toast.makeText(getApplicationContext(), "验证码是:" + editText.getEditContent(), Toast.LENGTH_LONG).show();
  35. if (!editText.getEditContent().equals("1234")) {
  36. text.setText("验证码输入错误");
  37. text.setTextColor(Color.RED);
  38. }
  39. }
  40.  
  41. @Override
  42. public void deleteContent(boolean isDelete) {
  43. if (isDelete){
  44. text.setText("输入验证码表示同意《用户协议》");
  45. text.setTextColor(Color.BLACK);
  46. }
  47. }
  48. }

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/activity_main"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. android:background="@mipmap/bg_view1"
  9. tools:context="com.xiaviv.securitycodedemo.MainActivity">
  10.  
  11. <com.loaderman.securitycodedemo.SecurityCodeView
  12. android:id="@+id/scv_edittext"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:layout_gravity="center_horizontal"
  16. android:layout_marginLeft="20dp"
  17. android:layout_marginRight="20dp"
  18. android:layout_marginTop="20dp" />
  19.  
  20. <TextView
  21. android:id="@+id/tv_text"
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:layout_marginLeft="20dp"
  25. android:layout_marginRight="20dp"
  26. android:layout_marginTop="10dp"
  27. android:layout_weight="4"
  28. android:text="输入验证码表示同意《用户协议》" />
  29. </LinearLayout>
  1. import android.content.Context;
  2. import android.text.Editable;
  3. import android.text.TextWatcher;
  4. import android.util.AttributeSet;
  5. import android.view.KeyEvent;
  6. import android.view.View;
  7. import android.widget.EditText;
  8. import android.widget.RelativeLayout;
  9. import android.widget.TextView;
  10.  
  11. public class SecurityCodeView extends RelativeLayout {
  12. private EditText editText;
  13. private TextView[] TextViews;
  14. private StringBuffer stringBuffer = new StringBuffer();
  15. private int count = 4;
  16. private String inputContent;
  17.  
  18. public SecurityCodeView(Context context) {
  19. this(context, null);
  20. }
  21.  
  22. public SecurityCodeView(Context context, AttributeSet attrs) {
  23. this(context, attrs, 0);
  24. }
  25.  
  26. public SecurityCodeView(Context context, AttributeSet attrs, int defStyleAttr) {
  27. super(context, attrs, defStyleAttr);
  28. TextViews = new TextView[4];
  29. View.inflate(context, R.layout.view_security_code, this);
  30.  
  31. editText = (EditText) findViewById(R.id.item_edittext);
  32. TextViews[0] = (TextView) findViewById(R.id.item_code_iv1);
  33. TextViews[1] = (TextView) findViewById(R.id.item_code_iv2);
  34. TextViews[2] = (TextView) findViewById(R.id.item_code_iv3);
  35. TextViews[3] = (TextView) findViewById(R.id.item_code_iv4);
  36.  
  37. editText.setCursorVisible(false);//将光标隐藏
  38. setListener();
  39. }
  40.  
  41. private void setListener() {
  42. editText.addTextChangedListener(new TextWatcher() {
  43.  
  44. @Override
  45. public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  46.  
  47. }
  48.  
  49. @Override
  50. public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  51.  
  52. }
  53.  
  54. @Override
  55. public void afterTextChanged(Editable editable) {
  56. //重点 如果字符不为""时才进行操作
  57. if (!editable.toString().equals("")) {
  58. if (stringBuffer.length() > 3) {
  59. //当文本长度大于3位时edittext置空
  60. editText.setText("");
  61. return;
  62. } else {
  63. //将文字添加到StringBuffer中
  64. stringBuffer.append(editable);
  65. editText.setText("");//添加后将EditText置空 造成没有文字输入的错局
  66. // Log.e("TAG", "afterTextChanged: stringBuffer is " + stringBuffer);
  67. count = stringBuffer.length();//记录stringbuffer的长度
  68. inputContent = stringBuffer.toString();
  69. if (stringBuffer.length() == 4) {
  70. //文字长度位4 则调用完成输入的监听
  71. if (inputCompleteListener != null) {
  72. inputCompleteListener.inputComplete();
  73. }
  74. }
  75. }
  76.  
  77. for (int i = 0; i < stringBuffer.length(); i++) {
  78. TextViews[i].setText(String.valueOf(inputContent.charAt(i)));
  79. TextViews[i].setBackgroundResource(R.mipmap.bg_verify_press);
  80. }
  81.  
  82. }
  83. }
  84. });
  85.  
  86. editText.setOnKeyListener(new OnKeyListener() {
  87. @Override
  88. public boolean onKey(View v, int keyCode, KeyEvent event) {
  89. if (keyCode == KeyEvent.KEYCODE_DEL
  90. && event.getAction() == KeyEvent.ACTION_DOWN) {
  91. if (onKeyDelete()) return true;
  92. return true;
  93. }
  94. return false;
  95. }
  96. });
  97. }
  98.  
  99. public boolean onKeyDelete() {
  100. if (count == 0) {
  101. count = 4;
  102. return true;
  103. }
  104. if (stringBuffer.length() > 0) {
  105. //删除相应位置的字符
  106. stringBuffer.delete((count - 1), count);
  107. count--;
  108. // Log.e(TAG, "afterTextChanged: stringBuffer is " + stringBuffer);
  109. inputContent = stringBuffer.toString();
  110. TextViews[stringBuffer.length()].setText("");
  111. TextViews[stringBuffer.length()].setBackgroundResource(R.mipmap.bg_verify);
  112. if (inputCompleteListener != null)
  113. inputCompleteListener.deleteContent(true);//有删除就通知manger
  114.  
  115. }
  116. return false;
  117. }
  118.  
  119. /**
  120. * 清空输入内容
  121. */
  122. public void clearEditText() {
  123. stringBuffer.delete(0, stringBuffer.length());
  124. inputContent = stringBuffer.toString();
  125. for (int i = 0; i < TextViews.length; i++) {
  126. TextViews[i].setText("");
  127. TextViews[i].setBackgroundResource(R.mipmap.bg_verify);
  128. }
  129. }
  130.  
  131. @Override
  132. public boolean onKeyDown(int keyCode, KeyEvent event) {
  133. return super.onKeyDown(keyCode, event);
  134. }
  135.  
  136. private InputCompleteListener inputCompleteListener;
  137.  
  138. public void setInputCompleteListener(InputCompleteListener inputCompleteListener) {
  139. this.inputCompleteListener = inputCompleteListener;
  140. }
  141.  
  142. public interface InputCompleteListener {
  143. void inputComplete();
  144.  
  145. void deleteContent(boolean isDelete);
  146. }
  147.  
  148. /**
  149. * 获取输入文本
  150. *
  151. * @return
  152. */
  153. public String getEditContent() {
  154. return inputContent;
  155. }
  156.  
  157. }

view_security_code.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content">
  5.  
  6. <LinearLayout
  7. android:layout_width="wrap_content"
  8. android:layout_height="47dp"
  9. android:gravity="center"
  10. android:orientation="horizontal"
  11. android:weightSum="3">
  12.  
  13. <TextView
  14. android:id="@+id/item_code_iv1"
  15. style="@style/text_editStyle" />
  16.  
  17. <View
  18. android:layout_width="0dp"
  19. android:layout_height="wrap_content"
  20. android:layout_weight="1" />
  21.  
  22. <TextView
  23. android:id="@+id/item_code_iv2"
  24. style="@style/text_editStyle" />
  25.  
  26. <View
  27. android:layout_width="0dp"
  28. android:layout_height="wrap_content"
  29. android:layout_weight="1" />
  30.  
  31. <TextView
  32. android:id="@+id/item_code_iv3"
  33. style="@style/text_editStyle" />
  34.  
  35. <View
  36. android:layout_width="0dp"
  37. android:layout_height="wrap_content"
  38. android:layout_weight="1" />
  39.  
  40. <TextView
  41. android:id="@+id/item_code_iv4"
  42. style="@style/text_editStyle" />
  43.  
  44. </LinearLayout>
  45.  
  46. <EditText
  47. android:id="@+id/item_edittext"
  48. android:layout_width="match_parent"
  49. android:layout_height="46dp"
  50. android:background="@android:color/transparent"
  51. android:inputType="number" />
  52. </RelativeLayout>

style.xml中

  1. <style name="text_editStyle" >
  2. <item name="android:layout_height">47dp</item>
  3. <item name="android:layout_width">47dp</item>
  4. <item name="android:background">@mipmap/bg_verify</item>
  5. <item name="android:gravity">center</item>
  6. <item name="android:textColor">@color/common_blue_0090FF</item>
  7. <item name="android:textSize">18sp</item>
  8.  
  9. </style>

效果图:


本文学习来源:http://www.jianshu.com/p/88d30b1d85df


Android EditText方框验证码 短信验证码的实现的更多相关文章

  1. Android学习笔记之短信验证码的获取和读取

    PS:最近很多事情都拖拖拉拉的..都什么办事效率啊!!! 还得吐槽一下移动运营商,验证码超过五次的时候,直接把我的手机号封闭.真是受够了. 学习笔记: 1.Android之如何获取短信验证码. 2.如 ...

  2. 转载:Android自动化测试- 自动获取短信验证码

    前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android ...

  3. 云片-语音验证码--短信验证码 - PHP接口

    ///////////////////////语音验证///////////////////////////// /**  * 发送短信(语音验证码)云片语音服务  * @param  $apikey ...

  4. Android EditText方框验证码 短信验证码攻略

    本文由xiawe_i提供. xiawe_i的博客地址是: http://www.jianshu.com/u/fa9f03a240c6 项目中有这样一个需求: 验证码页是四个方框,输入验证码方框颜色改变 ...

  5. Android之短信验证码

    我们今天所使用的方案仅仅是android手机设备集成短信验证码功能的方案之中的一个. 我们所採用的方案是使用聚合数据的短信验证sdk. 程序的界面例如以下所看到的: 实现步骤: 1.到聚合数据官网上申 ...

  6. sharesdk短信验证码的集成

    在ShareSDK官网http://mob.com/注册并创建Android应用.申请APP_key,下载SDK等 根据官网开发文档导入SDK,目录结构如下 将以上文件按需放入Android Stud ...

  7. Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结

    Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如 ...

  8. Django商城项目笔记No.5用户部分-注册接口-短信验证码

    Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...

  9. Android获取短信验证码

    Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发 ...

随机推荐

  1. python 写入JSON中文乱码解决方法

    在将一个字典添加入json中时多加入一个参数就可以了 json.dumps(dict(item), ensure_ascii=False) 例子 with open('zh-cn.json','w', ...

  2. JetBrains IDEA Web开发简单配置

    很早前因为使用了一年的MyEclipse,不想更换其他的IDE工具,是因为各项配置,以及快捷键等.前段时间更换了IDEA工具,初步了解了一些功能,包括快捷,调试,配置,都很优于MyEclipse.但是 ...

  3. svn使用教程(收藏)

    SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是什么? ...

  4. poj2987 Firing[最小割]

    题目 求选最少点个数的最大权闭合子图.(板子题) 最小割入门题,什么都不想说,丢个别人题解地址就跑. 附加几点个人理解:与s相通的S点集是闭合子图,剩下的与t相通的T点集是其他的.任意一个割都保证了有 ...

  5. java web课堂测试

    下面是web界面 <%@ page language="java" import="java.util.*" pageEncoding="UTF ...

  6. 提取包含QQ的文本为QQ邮箱

    # -*- coding: utf-8 -*- """ Created on Sun Dec 15 14:08:03 2019 @author: Dell 提取包含QQ号 ...

  7. Acwing-99-激光炸弹(二维前缀和)

    链接: https://www.acwing.com/problem/content/101/ 题意: 一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标. 现在地图上有 N 个目标, ...

  8. Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页

    1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...

  9. 数组 slice方法和splice方法的区别

    一.slice() 方法 slice()方法可以从已有的数组中返回选定的元素. 语法: arrayObject.slice(start,end) 参数: start:(截取开始位置的索引,包含开始索引 ...

  10. C# socket异步 服务端

    转自:  http://blog.csdn.net/qq_20282263/article/details/54310737 private Dictionary<string, Session ...