android:maxlength失效

今天遇见一个问题,在输入框中因为需求的需要设置输入长度,同时还需要设置不准输入特殊字符,但是利用android:maxlength,却发现限制长度失效,顿时测试部又激活了bug。

   检查代码,发现确实设置了android:maxlength,但是,自己又测试了一遍,发现的确是失效了。于是就想到是不是fliter的设置导致了长度设置失效。去掉了filter后,发现长度设置又再次生效,果然如此。溯本追源,便大概看一下为何如此,发现textView的构造方法(xml里面的设置在构造方法找应该不难想到)里面有这样的源码


可以看到,如果设置了maxlength,便会调用setFilters(new InputFilter[] { new InputFilter.LengthFilter(maxlength) });设置长度,否则就会调用setFilters(NO_FILTERS);  逻辑上不难理解,后这应该是不设置长度的意思。继续点进去,发现代码利用 filter的方法,源码代码截图如下:


和我代码写的差不多(截图如下),这就可以基本说明,其实本质上,maxlength也是设置filter,所以,不难理解,大概率的可能是自己写的filter覆盖了系统的,故而出现这种情况。


找到原因,就好解决了,在这里应该有两种思路,第一种就是直接在filter里面设置长度,也就是参照源码进行改写。第二种就是万能的安卓其实是可以同事设置多个filter,本人就是用的这种方法,代码如下。


至此,完美解决。感悟,1.真的不要想当然,要多测(本人就是想着设置maxlength就行没有仔细测) 2.无论什么方法得到解释,都不如看看源码解释理解的透彻。有空多看看源码,才会遇到奇葩问题不会无处下手。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android EditText禁止输入Emoji后设置android:maxLength失效 但是当我们设置了I...
    onlyxing阅读 2,207评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,011评论 25 709
  • 我是一个话超级多的一个人,简直就是啰嗦大妈,但是仅限于网上,在现实,我很文静,一副傻白甜的样子。 今天...
    简单过0_0阅读 399评论 0 0
  • 苏菲是一只了不起的蜘蛛,也是艺术家。她从少女开始,就不停地织网,一直织到老。 苏菲初来公寓,看见窗帘破旧,想...
    独酌相亲阅读 773评论 9 9
  • 试着玩毛笔,对字体讲究了一番! 挑了挑,仙人这个臭水平,也就适合搞搞,甲骨文,篆体的,别的,通通玩不了,太费劲! ...
    纵情嬉戏天地间阅读 226评论 11 0