后来想到xml中inputType属性可以设置输入的类型,也就是实现了限制输入的字符类型,于是想到查找这个属性对应的类方法,然后查看其源码实现,发现它里面用到了很多监听器,有好几个是实现了InputFilter接口的,看接口名字也很好理解,就是用于过滤输入的字符内容的,它与TextWather不同,TextWather是已经接收了输入的值并显示到了EditText上,然后把输入后的内容告诉你,而过滤器是先过滤,过滤出来的内容才显示到EditText上面,过滤器中的各个参数官方说的不太明白,或许是英文不好,不能很好理解,然后看官方上InputFilter的一些实现类,比如 InputFilter.AllCaps用于把字母变大写,InputFilter.LengthFilter用于限制输入的长度,看过了这些还不是很理解其接口的各参数的真正含意,于是只能自己打印参数自己分析其功能,也不知道是这不是这样的,总之解决了我的问题,代码如下:
/** 密码输入过滤器,过滤用户输入的字符序列,包含粘贴的字符序列。只允许ASCII码值为 33 ~ 126 范围内的字符 */
class PasswordTextFilter: InputFilter {
/**
* 过滤用户输入的字符序列,包含粘贴的字符序列。只允许ASCII码值为 33 ~ 126 范围内的字符
* @param source 用户新输入的字符序列或粘贴的字符序列(如果是输入的话是一个字符,如果粘贴的话可能是多个字符)
* @param start source字符序列中start ~ end(不包含end)范围内的字符序列是新输入的或粘贴过来的
* @param end source字符序列中start ~ end(不包含end)范围内的字符序列是新输入的或粘贴过来的
* @param dest 原来的字符序列。文档说不建议对这个字符序列对象进行任何的更改,只能用于检查。经过实验,我发现改了内容也没见发生有任何变化。
* @param dstart dest字符序列中dstart ~ dend(不包含dend)范围内的字符序列被删除了
* @param dend dest字符序列中dstart ~ dend(不包含dend)范围内的字符序列被删除了
* @return 返回新的字符序列来替换source字符序列,返回null表示接受原来的内容,返回空字符串则表示禁止本次输入(即输入的字符内容不会显示到EditText上)
*/
override fun filter(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence? {
return if (end - start > 0) {
// 这种情况说明是用户输入了新的内容,则进行过滤,只保留ASCII码值为 33 ~ 126 范围内的字符
source.subSequence(start, end).filter { c: Char -> c.toInt() in 33..126 }
} else {
// 这种情况说明是删除操作,删除操作时返回任何的内容好像都没用,比如返回888并不会在输入框看到888
null
}
}
}
### 总结
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
![2020面试真题解析](https://img-blog.csdnimg.cn/img_convert/d50832dbc782a5b38910ac8434c8e8ef.webp?x-oss-process=image/format,png)
![腾讯面试真题解析](https://img-blog.csdnimg.cn/img_convert/f27a641c8cc9d2adcd50b7e93f69a23e.webp?x-oss-process=image/format,png)
![阿里巴巴面试真题解析](https://img-blog.csdnimg.cn/img_convert/b762a9cdf02e16d669b6b69060bc571a.webp?x-oss-process=image/format,png)
![字节跳动面试真题解析](https://img-blog.csdnimg.cn/img_convert/b8d5d6decc6e64f8958de16c9553d94c.webp?x-oss-process=image/format,png)
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
![](https://img-blog.csdnimg.cn/img_convert/5deac702b508337e8a3eba8442702c8d.webp?x-oss-process=image/format,png)
希望这份系统化的技术体系对大家有一个方向参考。
[外链图片转存中...(img-0HCTQjM3-1725918598321)]