小编给大家分享一下如何使用Android实现常见的验证码输入框,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<强>正文强>
先搂一眼效果吧
不要把注意力都放在头顶的那一抹绿上,重点在输入框,可能大多数应用里都是采用6个方框的UI效果,我这里是按照我们设计的要求,用6根横线来划出6个数字的位置。一开始我想的是直接用6个TextView,然后传递焦点的做法,但是发现实现起来有一定的难度。又在网上查了一下,发现比较靠谱的办法是用6个TextView加一个EditText来实现,也按照这个方法去实现了,但是后来在测试的时候就发现了问题:网上给出的实现方式需要监听软键盘的删除按钮
editText.setOnKeyListener (new OnKeyListener (), { @Override。才能 ,,public boolean  onKey (View v, int 键码,,KeyEvent 事件),{ ,,,if (keyCode ==KeyEvent.KEYCODE_DEL ,,,,,,,,event.getAction (),==, KeyEvent.ACTION_DOWN), { ,,,,//TODO: ,,,,return 真实; ,,,} ,,,return 假; ,,} });才能
这是一个大家熟知的写法,但是这个监听的方法其实并不靠谱(在安卓原生键盘上就监听不到),因为这个监听是否触发,并没有强制的要求,全看输入法开发者的心情,这是官方文档中的描述:
按键软件键盘通常会不会触发此方法,虽然在某些情况下,有些人可能会选择这样做。
只能输入,不能删除,这可不行啊,用户肯定会骂娘的,我可不想被拿去去祭天什么的……
于是乎只能想办法在原有的基础上做一些修改,来规避这个问题,最后采用的方案是:采用一个TextView的数组来维护6个TextView,然后藏一个透明的EditTextView在后面用于接收用户输入的内容,再把输入的内容展示到6个TextView上就行了,UI什么的可以自己随意设计。在实现的过程中,遇到的一个关键问题就是:当输入的内容超过6位以后我该如何处理?一开始的方案是通过判断当前输入的位数然后再做相应的处理,网上的方案也是这么实现的,我后来一想,根本用不着这么麻烦,只需要一行属性就能解决这个问题:
android:最大长度=?“
只需要在EditText的属性里限制它的最大长度,就不用再去代码里做处理了,直接把EditTextView里的内容完全照搬到TextView上就可以了。
最终的完整代码如下:
public class VerifyCodeView extends RelativeLayout { editText, private EditText ; ,private TextView[],两个; ,private static  int MAX =, 6; ,private String  inputContent; ,public VerifyCodeView (Context 上下文),{ 这才能(上下文,null); ,} ,public VerifyCodeView (Context 上下文,AttributeSet attrs), { 这才能(上下文,attrs,, 0); ,} ,public VerifyCodeView (Context 上下文,AttributeSet attrs,, int defStyleAttr), { 超级才能(上下文,attrs,, defStyleAttr); View.inflate才能(上下文,R.layout.view_verify_code,,); 时间=textViews 才能;new TextView (MAX); 两个才能[0],=,(TextView), findViewById (R.id.item_code_iv0); 两个才能[1],=,(TextView), findViewById (R.id.item_code_iv1); 两个才能[2],=,(TextView), findViewById (R.id.item_code_iv2); 两个才能[3],=,(TextView), findViewById (R.id.item_code_iv3); 两个才能[4],=,(TextView), findViewById (R.id.item_code_iv4); 两个才能[5],=,(TextView), findViewById (R.id.item_code_iv5); editText 才能=,(EditText), findViewById (R.id.item_edittext); editText.setCursorVisible才能(假);//隐藏光标 setEditTextListener才能(); ,} ,private void  setEditTextListener (), { editText.addTextChangedListener才能(new TextWatcher (), { @Override。才能 ,,public void  beforeTextChanged (CharSequence charSequence进行,int 我,int i1,, int i2), { ,,} @Override。才能 ,,public void  onTextChanged (CharSequence charSequence进行,int 我,int i1,, int i2), { ,,} @Override。才能 ,,public void  afterTextChanged (Editable 可编辑),{ ,,,inputContent =, editText.getText () .toString (); ,,,if (inputCompleteListener !=, null), { ,,,,if (inputContent.length(),在=,MAX), { ,,,,,inputCompleteListener.inputComplete (); ,,,,},{else ,,,,,inputCompleteListener.invalidContent (); ,,,,} ,,,} ,,,for (int 小姐:=,0;,小姐:& lt;, MAX;,我+ +),{ ,,,,if (小姐:& lt;, inputContent.length ()), { ,,,,,两个[我]. settext (String.valueOf (inputContent.charAt(我))); ,,,,},{else ,,,,,两个[我]. settext (“;”); ,,,,} ,,,} ,,} ,,}); ,} null null null null null null null null null null null null null null null null null null如何使用Android实现常见的验证码输入框