MaterialDesign--(5)TextInputLayout 的使用以及如何閱讀源碼

能學到什么?

1.TextInputLayout 的使用
2.TextInputLayout 的所有屬性
3.如何閱讀 TextInputLayout 源碼來實現自己想要的效果,遇到這類控件再也不用去百度了~~


老規矩,先上圖。

TextInputLayout.gif

如何用?

在創建項目的時候選擇Login Activity即可得到上圖的效果

TextInputLayout.png

xml 結構如下

xml 結構.png

就是在 EditText 外包裹了一個 TextInputLayout 布局,就像穿了一件衣服一樣。百度隨便一搜,就能搜到很多 TextInputLayout 的使用方法。
等等,剛剛說什么?百度一搜,作為程序員,要使用一個系統控件去搜百度會不會有點 low?可能有朋友會說,這還不簡單,我 Google 不就行了么。不不不,我不是這個意思,其實我們可以通過看通過源碼來學習怎樣使用這個控件呀。
好了,不閑聊了,滴滴滴~~~

滴滴滴.png

首先,我們是知道這個控件大致有哪些功能的,那么我們就先去找它的 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 圖片~~~~

attrs.png

TextInputLayout 的 public 方法

直接看類結構圖,不知道類結構圖在哪的請看下圖綠色箭頭

TextInputLayout Structure.png

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,然后搜到的東西還不一定是你想要的,導致效率特別低下。其實關于這些系統控件,直接去看源碼才是最便捷的選擇。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容