需要輸入框熟菲?試試TextInputLayout

版權(quán)聲明:

本賬號發(fā)布文章均來自公眾號,承香墨影(cxmyDev)朴恳,版權(quán)歸承香墨影所有抄罕。

未經(jīng)允許,不得轉(zhuǎn)載于颖。

一呆贿、前言

Design Support Library 是 Google 發(fā)布的一個全新的兼容函數(shù)庫,它可以在 Android 2.1 (Api level 7)及以上的設備中森渐,實現(xiàn) Material Design 的效果做入,這個函數(shù)庫同時也提供了一系列控件。今天介紹的 TextInputLayout(以下簡稱 TIL) 就是其中之一同衣。

在使用 Design Support Library 之前竟块,需要在 build.gradle 文件中,添加依賴耐齐,這里使用的是 25.3.0浪秘。

compile 'com.android.support:design:25.3.0'

二、什么是TextInputLayout埠况?

TIL 繼承自 LinearLayout 耸携,可以用它實現(xiàn) Material Design 效果的一個表單輸入框。

類似如下效果:

til-demo.gif

從實現(xiàn)的功能可以看到辕翰,它在原本的 EditText 的基礎之上夺衍,添加了一些表單錄入必要的功能:

  1. 輸入提示,不同于原有 EditText 的 hint 屬性喜命,它可以在輸入的時候沟沙,將提示的字符,通過一個動態(tài)的效果壁榕,顯示在 EditText 的上面尝胆。
  2. 錯誤提示,在有錯誤的信息錄入的時候护桦,可以通過一個友善的方式含衔,將錯誤提示給用戶。
  3. 密碼是否可見標志二庵,這個常見于密碼輸入的時候贪染,輸入內(nèi)容是否可用。
  4. 輸入的字符數(shù)量和最大輸入限制并且顯示催享。

TIL 其實就是我們對表單錄入的一個基本要求杭隙,例如實現(xiàn)一個簡單的登錄頁面,完全是可以滿足我們的需求的因妙,并且它還屬于 Material Design 的效果規(guī)范痰憎。

這些效果票髓,我們只需要使用 TIL 的屬性和方法,即可完成這些功能铣耘,而在之前我們都需要開發(fā)者對其單獨開發(fā)洽沟。

三、使用TextInputLayout

TIL 從名字上看也能猜到蜗细,它是一個 Layout 裆操,并且是繼承自 LinearLayout ,但是它只能容納一個 EditText炉媒,而實際上從它設計的角度來看踪区,也不推薦再在其內(nèi)包含其它的 View 了,因為這樣會破壞 TIL 原本的設計吊骤。

til-layout.png

在使用過程中缎岗,是可以不用為 TIL 中的 EditText 單獨設定 id 進行操作的,大部分操作都是可以通過 TIL 自身的 API 進行操作的白粉,如果是在需要操作 EditText 對象传泊,TIL 也提供了對應的 getEditText() 方法,來獲取其內(nèi)的 EditView 對象蜗元。

這樣就完成了 TIL 最基本的功能或渤,接下來讓我們把 TIL 的特性拆分出來系冗,來看看實現(xiàn)個別功能需要使用到的屬性奕扣。

1、使用 hint 效果

TIL 中掌敬,可以通過使用 hint 對輸入的內(nèi)容進行提示惯豆,當其內(nèi)部的 EditText 獲取到焦點的時候,將 hint 的內(nèi)容上移奔害。

在 TIL 中楷兽,使用 hint 效果,相關(guān)的屬性和方法:

  • android:hint :設置 hint华临。
  • app:hintEnabled:設置 hint 是否可見芯杀,默認為 true。
  • app:hintAnimationEnabled:設置 hint 上移的時候是否有動畫雅潭,默認為 true揭厚。
  • app:hintTextAppearance:設置 hint 的樣式。
  • setHint():設置 hint 扶供。
  • setHintAnimationEnabled():設置 hint 是否可見筛圆。
  • isHintAnimationEnabled():判斷當前 hint 的可見狀態(tài)。

最簡單的用法椿浓,就是只使用 android:hint 屬性設置一次 hint 即可太援,但是也需要了解一下如何修改它的其他屬性闽晦。

2、使用錯誤提示

TIL 中提岔,錯誤一般都是在邏輯代碼里仙蛉,通過對輸入數(shù)據(jù)的校驗,來進行提示唧垦,但是同時也可以使用屬性設置錯誤提示的樣式捅儒。

在 TIL 中,使用錯誤提示的相關(guān)屬性和方法:

  • app:errorEnabled:是否顯示錯誤提示振亮。
  • app:errorTextAppearance:設置錯誤提示的樣式巧还。
  • setErrorEnabled():設置錯誤是否可見。
  • setErrorTextAppearance():設置錯誤提示的樣式坊秸。
  • isErrorEnabled():判斷當前是否顯示錯誤提示麸祷。
  • setError():設置錯誤提示的錯誤信息。

3褒搔、使用密碼開關(guān)

TIL 在內(nèi)部 EditText 的 android:inputType 為 xxxPassword 的時候阶牍,可以在 TIL 配置一個圖標按鈕,用于開啟和關(guān)閉是否顯示密碼內(nèi)容星瘾。

使用密碼開關(guān)功能走孽,使用到的相關(guān)屬性和方法:

  • app:passwordToggleEnabled:設置 password 開關(guān)是否可用。
  • app:passwordToggleTint:設置 password 開關(guān)圖標的 tint 著色琳状。
  • app:passwordToggleTintMode:設置 password tint 的模式磕瓷。
  • app:passwordToggleDrawable:設置 password 開關(guān)圖標。
  • setPasswordVisibilityToggleDrawable:設置 password 開關(guān)圖標念逞。
  • isPasswordVisibilityToggleEnabled:設置 password 開關(guān)圖標 是否可見困食。
  • setPasswordVisibilityToggleTintList:設置 password 開關(guān)圖標的 tint。
  • setPasswordVisibilityToggleTintMode:設置 password 開關(guān)圖標的 tint 模式翎承。
  • getPasswordVisibilityToggleDrawable:設置 password 開關(guān)圖標硕盹。

一般來說,我們使用默認的眼睛樣式的圖標即可叨咖。如果一定需要修改瘩例,可以參見 Widget.Design.TextInputLayout 中的設定進行修改。

4甸各、使用輸入限制長度提示

TIL 也可以設定當前輸入的字符長度垛贤,以及限定的字符長度。

相關(guān)屬性和方法:

  • app:counterEnabled:設置輸入限制長度是否顯示痴晦。
  • app:counterMaxLength:設置最大輸入字符長度南吮。
  • app:counterEnabled:設置輸入字符提示是否顯示。
  • app:counterTextAppearance:設置輸入字符長度提示的樣式誊酌。
  • setCounterEnabled():設置長度顯示是否顯示部凑。

可以單獨使用 counterEnabled 露乏,也可以配合 counterMaxLength 使用。

TIL 對輸入支付長度的限制提示涂邀,如果超過 counterMaxLength 的限制瘟仿,只是會變色提示,但是并不會讓阻止用戶繼續(xù)輸入比勉。

5劳较、修改樣式

默認的樣式其實已經(jīng)夠我們使用了,除了使用對應屬性的 xxxTextAppearance 對其最終使用的 TextView 進行設定樣式外浩聋。還可以在style 中观蜗,統(tǒng)一設定,具體每個屬性的格式衣洁,可以參考Widget.Design.TextInputLayout 中的設定墓捻。

til-style.png

四、TextInputLayout細節(jié)探究

之前就說過坊夫,雖然 MD 的設計很酷炫砖第,但是實際上,我們在學習它的使用過程中环凿,有一些它設計上的優(yōu)點梧兼,值得我們學習,這才是精髓部分智听。

看看上面介紹的 TIL 的一些特性的設置來看看他們具體是如何實現(xiàn)的羽杰。

首先先讓我們看看最終顯示出來的布局結(jié)構(gòu)。

til-layout1.png

可以看到瞭稼,雖然在我們設定的布局中忽洛,看著 EditText 是 TextInputLayot 的直接子 View 腻惠,但是從源碼上看环肘,在 TIL 中,會使用一個 FrameLayout 類型的 mInputFrame集灌,將其添加到 TIL 中悔雹。

til-create.png

而真正遇到 EditText 的時候,卻將其攔截下來欣喧,再添加到這個 mInputFrame 布局中腌零。

til-addview.png

那么接下來看看 hint 屬性的效果是如何實現(xiàn)的。

從布局結(jié)構(gòu)上看唆阿,hint 的文字益涧,是直接 draw 到 TIL 上的,所以它并不是和其他效果一樣是用 TextView 堆起來的驯鳖。

繼續(xù)源碼中找蛛絲馬跡闲询。

til-draw.png

可以看到久免,如果 hint 需要被顯示,將會把具體的實現(xiàn)扭弧,托管給 mCollapsingTextHelper 來處理 hint 效果的邏輯阎姥,這里就不繼續(xù)跟下去了,有興趣的可以找出來看看鸽捻。

從上面布局結(jié)構(gòu)可以看到呼巴,除了 mInputFrame 之外,還有一個 LinearLayout 的布局御蒲,它用于承載 mErrorView(錯誤提示) 和 mCounterView(輸入計數(shù))衣赶。

til-a.png

這個 LinearLayout 就是 mIndicatorArea。當 mErrorView 被使用完之后厚满,也有對應的代碼邏輯將其從 mIndicatorArea 中移除掉屑埋。

到這里,TIL 的關(guān)鍵設計點就已經(jīng)清楚了痰滋,它不像外部看到的布局那樣摘能,直接使用 EditText ,而是對其進行多個布局的包裝敲街,讓不同的功能單獨拆分出來去實現(xiàn)团搞。

五、結(jié)語

到這里就結(jié)束了多艇,之后再繼續(xù)介紹 Support Design 里的其它控件逻恐。

公眾號二維碼.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市峻黍,隨后出現(xiàn)的幾起案子复隆,更是在濱河造成了極大的恐慌,老刑警劉巖姆涩,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挽拂,死亡現(xiàn)場離奇詭異,居然都是意外死亡骨饿,警方通過查閱死者的電腦和手機亏栈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宏赘,“玉大人绒北,你說我怎么就攤上這事〔焓穑” “怎么了闷游?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我脐往,道長俱济,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任钙勃,我火速辦了婚禮蛛碌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辖源。我一直安慰自己蔚携,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布克饶。 她就那樣靜靜地躺著酝蜒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矾湃。 梳的紋絲不亂的頭發(fā)上亡脑,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音邀跃,去河邊找鬼霉咨。 笑死,一個胖子當著我的面吹牛拍屑,可吹牛的內(nèi)容都是我干的途戒。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼僵驰,長吁一口氣:“原來是場噩夢啊……” “哼喷斋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒜茴,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤星爪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粉私,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顽腾,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年毡鉴,在試婚紗的時候發(fā)現(xiàn)自己被綠了崔泵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秒赤。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡猪瞬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出入篮,到底是詐尸還是另有隱情陈瘦,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布潮售,位于F島的核電站痊项,受9級特大地震影響锅风,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鞍泉,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一皱埠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咖驮,春花似錦边器、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睦刃,卻和暖如春砚嘴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涩拙。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工际长, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兴泥。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓也颤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親郁轻。 傳聞我的和親對象是個殘疾皇子翅娶,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容