能學到什么?
1.TextInputLayout 的使用
2.TextInputLayout 的所有屬性
3.如何閱讀 TextInputLayout 源碼來實現自己想要的效果,遇到這類控件再也不用去百度了~~
老規矩,先上圖。
如何用?
在創建項目的時候選擇Login Activity即可得到上圖的效果
xml 結構如下
就是在 EditText 外包裹了一個 TextInputLayout 布局,就像穿了一件衣服一樣。百度隨便一搜,就能搜到很多 TextInputLayout 的使用方法。
等等,剛剛說什么?百度一搜,作為程序員,要使用一個系統控件去搜百度會不會有點 low?可能有朋友會說,這還不簡單,我 Google 不就行了么。不不不,我不是這個意思,其實我們可以通過看通過源碼來學習怎樣使用這個控件呀。
好了,不閑聊了,滴滴滴~~~
首先,我們是知道這個控件大致有哪些功能的,那么我們就先去找它的 attrs 屬性,然后再對比TextInputLayout的方法。TextInputLayout的源碼差不多有1500,有點多,作為一個比較會偷懶的程序員,肯定是不想一行一行代碼去捋邏輯,但是我們又想知道 TextInputLayout 的所有可定制的功能,怎么辦?
看過設計模式的童鞋們都知道,一共有23種設計模式,而這23種設計模式都遵循了面向對象的六大原則(有些說法是七大原則,我不 care 這個),其中有一條原則叫:“開閉原則 OCP”。
開閉原則(OCP:Open Closed Principle)
核心思想:對擴展開放,對修改關閉。即在設計一個模塊的時候,應當使這個模塊可以在不被修改的前提下被擴展。
根據開閉原則,在設計一個軟件系統模塊(類,方法)的時候,應該可以在不修改原有的模塊(修改關閉)的基礎上,能擴展其功能(擴展開放)。
TextInputLayout在 design 包下,是 Google 發布的,代碼規范性自然不用說,所以我們只需要關心 public 方法即可。
attrs 屬性
我們在 design 包的 res> value 文件里面搜索一下 TextInputLayout 可以找到以下代碼
<declare-styleable name="TextInputLayout">
<attr format="reference" name="hintTextAppearance"/>
<attr name="android:hint"/>
<attr format="boolean" name="hintEnabled"/>
<attr format="boolean" name="errorEnabled"/>
<attr format="reference" name="errorTextAppearance"/>
<attr format="boolean" name="counterEnabled"/>
<attr format="integer" name="counterMaxLength"/>
<attr format="reference" name="counterTextAppearance"/>
<attr format="reference" name="counterOverflowTextAppearance"/>
<attr name="android:textColorHint"/>
<attr format="boolean" name="hintAnimationEnabled"/>
<attr format="boolean" name="passwordToggleEnabled"/>
<attr format="reference" name="passwordToggleDrawable"/>
<attr format="string" name="passwordToggleContentDescription"/>
<attr format="color" name="passwordToggleTint"/>
<attr name="passwordToggleTintMode">
<enum name="src_over" value="3"/>
<enum name="src_in" value="5"/>
<enum name="src_atop" value="9"/>
<enum name="multiply" value="14"/>
<enum name="screen" value="15"/>
</attr>
</declare-styleable>
好了,其實光看名字,就能猜出這個屬性是干嘛的了,為了避免有些同學寫錯,我這里一張圖讓你看明白。好煩呀,又要去 ps 圖片~~~~
TextInputLayout 的 public 方法
直接看類結構圖,不知道類結構圖在哪的請看下圖綠色箭頭
TextInputLayout 暴露出來的public 方法基本和 attrs 的屬性對的上。
- typeface
- setTypeface(Typeface)設置 hint 等字體
- getTypeface(Typeface)獲取 hint 等字體
- editText
- getEditText() 獲取子控件 EditText
- hint
- setHint(CharSequence)設置 hint 文字
- getHint()獲取 hint 文字
- hintEnable
- setHintEnable(boolean)設置是否顯示 hint
- isHintEnable() 獲取是否顯示 hint
- hintTextAppearance
- setHintTextAppearance() 設置 hint 文本顏色
- errorEnable
- setErrorEnable()設置是否顯示錯誤提示
- isErrorEnable();獲取是否顯示錯誤提示
- ErrorTextAppearance
- setErrortextAppearance(int) 設置錯誤提示樣式
- error
- setError(charSequence)設置錯誤提示文本 不可以通過 attrs 屬性設置
- getError();獲取錯誤提示文本
- counterEnable
- setCounterEnable(boolean)設置計數器開關
- isCounterEnable() 獲取是否打開計數器
- counterMaxLength
- setCounterMaxLength(int)設置計數器最大文本長度
- getCounterMaxLength(); 獲取計數器設置的最大文本長度
- hintAnimationEnable
- setHintAnimationEnable(boolean) 設置是否顯示 hint 動畫
- isHintAnimationEnable() 獲取 hint 動畫是否打開
- passwordVisiblityToggleDrawable系列
- setPasswordVisiblityToggleDrawable(Drawable)設置密碼可見開關圖片
- getPasswordVisiblityToggleDrawable()虎丘密碼可見開關圖片
- setPasswordVisiblityToggleEnable(boolean)設置密碼可見開關是否可用
- isPasswordVisiblityToggleEnable()獲取密碼可見開關是否可用
- setPasswordVisiblityToggleTintList(ColorStateList)設置密碼可見開關顏色
這里的方法和上面的 attr 屬性名基本上對的上,如果不能通過名字推測功能的話,可以點進源碼看方法注釋,都有詳細說明的。如果看不懂英文文檔的,請復制粘貼到這里http://fanyi.baidu.com/
好了,TextInputLayout 就到這里了,沒有源碼分析,其實也不需要去分析源碼,因為我們自己去手擼一個TextInputLayout,其實也是可以擼出來的,就是一個自定義 View,繼承 LinearLayout,然后獲取里面的 Edittext,設置 hint 動畫,然后添加一些關于密碼的自定義屬性,再加上一個對 EditText 的輸入監聽顯示字數。把上面所有的設置方法暴露出來,最后讓這個 View 看起來美觀一點。。。。。
結束語
很早以前就知道 TextInputLayout 這個控件,中間也看過幾次相關的 blog,自己也用過幾次,就是每次用的時候,碰到任何問題都需要去搜 blog,然后搜到的東西還不一定是你想要的,導致效率特別低下。其實關于這些系統控件,直接去看源碼才是最便捷的選擇。