提起TextView,脑子里想着用起来应该是很简单的,然而作为显示文字的所有控件的基类,想要完全挖掘出TextView的能力,还是很复杂的。最近做一个需求,要在限制长度的输入框里识别粘贴的淘口令,因为对TextView了解太肤浅,bug无数,特意看一下源码学习一下(听iOS同学说,各个平台的对外接口都比较接近,这也是一个认知文字系统的好方法)。
主要关注TextView对外暴露的set接口,以及hook。
- TransformationMethod
对外提供了对文字进行转换的接口。回调时机是在beforeTextChanged和onTextChanged之间。也就是说这两个回调给出的修改内容可能是不一致的。同时,这个是个set方法,不是add方法,所以会相互覆盖。setAllCaps、是用这个接口实现的。
- TextWatcher
变化的回调,在setText时回调。同时会作为span传给Editable,Editable在变化时,也会回调。神奇的设置
- MovementMethod
初始化回调时机是在beforeTextChanged和onTextChanged之间。调用对应回调的时机比较混乱,而且并没有统一的短路逻辑。
- OnEditorActionListener,EditorAction回调
- InputFilter,目前只有最长输入字符控制在用,回调在beforeTextChanged之前。inflate时,如果没有设置maxLength会清空
- KeyListener,允许输入内容的规范。
- 直接搞的,各种各样的flag。
- setAutoLinkMask,在beforeTextChanged和onTextChanged之间对链接进行处理
- setCompoundDrawables,在onDraw时候画上去的,会调用requestLayout
- setCustomSelectionActionModeCallback,自定义menu实例
- setEllipsize,在TextUtils里处理,BoringLayout使用
- set各种最大最小,onMeasure用到
- setImeActionLabel,可以定制化键盘行为
顺便记一下Spanned#SPAN_xxCLUSIVE_xxCLUSIVE的作用:
以输入发生在Span前,如果是Inclusive,新输入的内容自带span。如果是Exclusive则不带span。