1. 程式人生 > >[原始碼]TextView原始碼

[原始碼]TextView原始碼

提起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。