Android EditText方框验证码 短信验证码的实现
- package com.loaderman.securitycodedemo;
- import android.graphics.Color;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends AppCompatActivity implements SecurityCodeView.InputCompleteListener {
- private SecurityCodeView editText;
- private TextView text;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- findViews();
- setListener();
- }
- private void setListener() {
- editText.setInputCompleteListener(this);
- }
- private void findViews() {
- editText = (SecurityCodeView) findViewById(R.id.scv_edittext);
- text = (TextView) findViewById(R.id.tv_text);
- }
- @Override
- public void inputComplete() {
- Toast.makeText(getApplicationContext(), "验证码是:" + editText.getEditContent(), Toast.LENGTH_LONG).show();
- if (!editText.getEditContent().equals("1234")) {
- text.setText("验证码输入错误");
- text.setTextColor(Color.RED);
- }
- }
- @Override
- public void deleteContent(boolean isDelete) {
- if (isDelete){
- text.setText("输入验证码表示同意《用户协议》");
- text.setTextColor(Color.BLACK);
- }
- }
- }
activity_main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:background="@mipmap/bg_view1"
- tools:context="com.xiaviv.securitycodedemo.MainActivity">
- <com.loaderman.securitycodedemo.SecurityCodeView
- android:id="@+id/scv_edittext"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_marginLeft="20dp"
- android:layout_marginRight="20dp"
- android:layout_marginTop="20dp" />
- <TextView
- android:id="@+id/tv_text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dp"
- android:layout_marginRight="20dp"
- android:layout_marginTop="10dp"
- android:layout_weight="4"
- android:text="输入验证码表示同意《用户协议》" />
- </LinearLayout>
- import android.content.Context;
- import android.text.Editable;
- import android.text.TextWatcher;
- import android.util.AttributeSet;
- import android.view.KeyEvent;
- import android.view.View;
- import android.widget.EditText;
- import android.widget.RelativeLayout;
- import android.widget.TextView;
- public class SecurityCodeView extends RelativeLayout {
- private EditText editText;
- private TextView[] TextViews;
- private StringBuffer stringBuffer = new StringBuffer();
- private int count = 4;
- private String inputContent;
- public SecurityCodeView(Context context) {
- this(context, null);
- }
- public SecurityCodeView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
- public SecurityCodeView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- TextViews = new TextView[4];
- View.inflate(context, R.layout.view_security_code, this);
- editText = (EditText) findViewById(R.id.item_edittext);
- TextViews[0] = (TextView) findViewById(R.id.item_code_iv1);
- TextViews[1] = (TextView) findViewById(R.id.item_code_iv2);
- TextViews[2] = (TextView) findViewById(R.id.item_code_iv3);
- TextViews[3] = (TextView) findViewById(R.id.item_code_iv4);
- editText.setCursorVisible(false);//将光标隐藏
- setListener();
- }
- private void setListener() {
- 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) {
- //重点 如果字符不为""时才进行操作
- if (!editable.toString().equals("")) {
- if (stringBuffer.length() > 3) {
- //当文本长度大于3位时edittext置空
- editText.setText("");
- return;
- } else {
- //将文字添加到StringBuffer中
- stringBuffer.append(editable);
- editText.setText("");//添加后将EditText置空 造成没有文字输入的错局
- // Log.e("TAG", "afterTextChanged: stringBuffer is " + stringBuffer);
- count = stringBuffer.length();//记录stringbuffer的长度
- inputContent = stringBuffer.toString();
- if (stringBuffer.length() == 4) {
- //文字长度位4 则调用完成输入的监听
- if (inputCompleteListener != null) {
- inputCompleteListener.inputComplete();
- }
- }
- }
- for (int i = 0; i < stringBuffer.length(); i++) {
- TextViews[i].setText(String.valueOf(inputContent.charAt(i)));
- TextViews[i].setBackgroundResource(R.mipmap.bg_verify_press);
- }
- }
- }
- });
- editText.setOnKeyListener(new OnKeyListener() {
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_DEL
- && event.getAction() == KeyEvent.ACTION_DOWN) {
- if (onKeyDelete()) return true;
- return true;
- }
- return false;
- }
- });
- }
- public boolean onKeyDelete() {
- if (count == 0) {
- count = 4;
- return true;
- }
- if (stringBuffer.length() > 0) {
- //删除相应位置的字符
- stringBuffer.delete((count - 1), count);
- count--;
- // Log.e(TAG, "afterTextChanged: stringBuffer is " + stringBuffer);
- inputContent = stringBuffer.toString();
- TextViews[stringBuffer.length()].setText("");
- TextViews[stringBuffer.length()].setBackgroundResource(R.mipmap.bg_verify);
- if (inputCompleteListener != null)
- inputCompleteListener.deleteContent(true);//有删除就通知manger
- }
- return false;
- }
- /**
- * 清空输入内容
- */
- public void clearEditText() {
- stringBuffer.delete(0, stringBuffer.length());
- inputContent = stringBuffer.toString();
- for (int i = 0; i < TextViews.length; i++) {
- TextViews[i].setText("");
- TextViews[i].setBackgroundResource(R.mipmap.bg_verify);
- }
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- return super.onKeyDown(keyCode, event);
- }
- private InputCompleteListener inputCompleteListener;
- public void setInputCompleteListener(InputCompleteListener inputCompleteListener) {
- this.inputCompleteListener = inputCompleteListener;
- }
- public interface InputCompleteListener {
- void inputComplete();
- void deleteContent(boolean isDelete);
- }
- /**
- * 获取输入文本
- *
- * @return
- */
- public String getEditContent() {
- return inputContent;
- }
- }
view_security_code.xml
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="47dp"
- android:gravity="center"
- android:orientation="horizontal"
- android:weightSum="3">
- <TextView
- android:id="@+id/item_code_iv1"
- style="@style/text_editStyle" />
- <View
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1" />
- <TextView
- android:id="@+id/item_code_iv2"
- style="@style/text_editStyle" />
- <View
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1" />
- <TextView
- android:id="@+id/item_code_iv3"
- style="@style/text_editStyle" />
- <View
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1" />
- <TextView
- android:id="@+id/item_code_iv4"
- style="@style/text_editStyle" />
- </LinearLayout>
- <EditText
- android:id="@+id/item_edittext"
- android:layout_width="match_parent"
- android:layout_height="46dp"
- android:background="@android:color/transparent"
- android:inputType="number" />
- </RelativeLayout>
style.xml中
- <style name="text_editStyle" >
- <item name="android:layout_height">47dp</item>
- <item name="android:layout_width">47dp</item>
- <item name="android:background">@mipmap/bg_verify</item>
- <item name="android:gravity">center</item>
- <item name="android:textColor">@color/common_blue_0090FF</item>
- <item name="android:textSize">18sp</item>
- </style>
效果图:
本文学习来源:http://www.jianshu.com/p/88d30b1d85df
Android EditText方框验证码 短信验证码的实现的更多相关文章
- Android学习笔记之短信验证码的获取和读取
PS:最近很多事情都拖拖拉拉的..都什么办事效率啊!!! 还得吐槽一下移动运营商,验证码超过五次的时候,直接把我的手机号封闭.真是受够了. 学习笔记: 1.Android之如何获取短信验证码. 2.如 ...
- 转载:Android自动化测试- 自动获取短信验证码
前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码. 主要就是实时获取短信信息. android ...
- 云片-语音验证码--短信验证码 - PHP接口
///////////////////////语音验证///////////////////////////// /** * 发送短信(语音验证码)云片语音服务 * @param $apikey ...
- Android EditText方框验证码 短信验证码攻略
本文由xiawe_i提供. xiawe_i的博客地址是: http://www.jianshu.com/u/fa9f03a240c6 项目中有这样一个需求: 验证码页是四个方框,输入验证码方框颜色改变 ...
- Android之短信验证码
我们今天所使用的方案仅仅是android手机设备集成短信验证码功能的方案之中的一个. 我们所採用的方案是使用聚合数据的短信验证sdk. 程序的界面例如以下所看到的: 实现步骤: 1.到聚合数据官网上申 ...
- sharesdk短信验证码的集成
在ShareSDK官网http://mob.com/注册并创建Android应用.申请APP_key,下载SDK等 根据官网开发文档导入SDK,目录结构如下 将以上文件按需放入Android Stud ...
- Atitit. 破解 拦截 绕过 网站 手机 短信 验证码 方式 v2 attilax 总结
Atitit. 破解 拦截 绕过 网站 手机 短信 验证码 方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码 用户操作 ,比如 ...
- Django商城项目笔记No.5用户部分-注册接口-短信验证码
Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...
- Android获取短信验证码
Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发 ...
随机推荐
- python 写入JSON中文乱码解决方法
在将一个字典添加入json中时多加入一个参数就可以了 json.dumps(dict(item), ensure_ascii=False) 例子 with open('zh-cn.json','w', ...
- JetBrains IDEA Web开发简单配置
很早前因为使用了一年的MyEclipse,不想更换其他的IDE工具,是因为各项配置,以及快捷键等.前段时间更换了IDEA工具,初步了解了一些功能,包括快捷,调试,配置,都很优于MyEclipse.但是 ...
- svn使用教程(收藏)
SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是什么? ...
- poj2987 Firing[最小割]
题目 求选最少点个数的最大权闭合子图.(板子题) 最小割入门题,什么都不想说,丢个别人题解地址就跑. 附加几点个人理解:与s相通的S点集是闭合子图,剩下的与t相通的T点集是其他的.任意一个割都保证了有 ...
- java web课堂测试
下面是web界面 <%@ page language="java" import="java.util.*" pageEncoding="UTF ...
- 提取包含QQ的文本为QQ邮箱
# -*- coding: utf-8 -*- """ Created on Sun Dec 15 14:08:03 2019 @author: Dell 提取包含QQ号 ...
- Acwing-99-激光炸弹(二维前缀和)
链接: https://www.acwing.com/problem/content/101/ 题意: 一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标. 现在地图上有 N 个目标, ...
- Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页
1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...
- 数组 slice方法和splice方法的区别
一.slice() 方法 slice()方法可以从已有的数组中返回选定的元素. 语法: arrayObject.slice(start,end) 参数: start:(截取开始位置的索引,包含开始索引 ...
- C# socket异步 服务端
转自: http://blog.csdn.net/qq_20282263/article/details/54310737 private Dictionary<string, Session ...