今天遇见一个问题,在输入框中因为需求的需要设置输入长度,同时还需要设置不准输入特殊字符,但是利用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.无论什么方法得到解释,都不如看看源码解释理解的透彻。有空多看看源码,才会遇到奇葩问题不会无处下手。
网友评论