因为项目需要,设计了一个下图样的验证码输入框(ps:个人认为还不如直接一个EditText,用户友好度可能更好,何况这页面99.9%的用户不会使用,但是没办法,别人才是专业的设计师)。
![9166166-e28a665c7499466d.png](https://i-blog.csdnimg.cn/blog_migrate/3293034fbc7de365722cd98d64ee7ee5.webp?x-image-process=image/format,png)
其实界面很简单,一个弹出框口,中间几个简单控件。也就验证码输入框需要自定义一下。首先看到,觉得继承个EditText或者View绘制下,然后监听下输入框情况就可以了。但是,本人比较懒,能用系统提供方法实现的话就尽量少去搞自定义。然后就变成了六个EditText接收值,但是如果每个EditText都搞监听,太浪费资源了,性能开销太大,输入也不流畅。之后,换下思维, 用了个十分粗暴但简单实用的方式:六个TextView+一个不可见EditText。
大概思路,六个带边框的TextView, 然后一个完全透明的EditText覆盖在六个TextView上用来接收键盘的输入(这样的好处事,不用自己处理键盘事件,也因此少了键盘带来的各种兼容性问题)。然后给EditText加一个监听,将接收到的收入值复制给每个TextView。
![9166166-3304149076383eb5.png](https://i-blog.csdnimg.cn/blog_migrate/a4b5a9ea6cb77e7712fdb78ab2bb98a2.webp?x-image-process=image/format,png)
在TextWatcher的afterTextChanged(Editable s)中
![9166166-67626635e0f458a7.png](https://i-blog.csdnimg.cn/blog_migrate/d03bb447e458628f265e56ceb932c462.webp?x-image-process=image/format,png)
另外提供清除方法
![9166166-7f81283518f50c49.png](https://i-blog.csdnimg.cn/blog_migrate/76962712c797272e5e6f0ad5d4736cda.webp?x-image-process=image/format,png)
和输入完成回调
![9166166-57054e9e5ae5f17c.png](https://i-blog.csdnimg.cn/blog_migrate/ffc2cc4fdf9ac5f86bba39edbb90b2a8.webp?x-image-process=image/format,png)
使用很简单
![9166166-35c4fb30df5f528e.png](https://i-blog.csdnimg.cn/blog_migrate/91d09c827dc399b66f4a63463584ab15.webp?x-image-process=image/format,png)
然后在Java代码中
![9166166-0b8c82d04fad4370.png](https://i-blog.csdnimg.cn/blog_migrate/a3a313a811c833bf00b3e7a60682ef71.webp?x-image-process=image/format,png)
这样做可以算是很简单粗暴的方式了,而且在UI发生变化时,也方便做一些调整。当然比较高级的Android玩家可能更喜欢去做一些标准的自定义控件,但我更推崇的是,在性能差别不大的情况下,使用最简单最快捷的方式去处理问题。
[简书ThinkinLiu](https://www.jianshu.com/p/d42dac7c5344) 博客: [IT老五](https://itlao5.com)
源码地址:http://git.oschina.net/thinkin/NumberEditText
转自我的oschina