在上一節(jié)我們講到了 TextView,它用來(lái)顯示一段文本。這一節(jié)可以算作成是 TextView 的延續(xù),因?yàn)閺墓δ苌?EditText 在 TextView 的基礎(chǔ)之上多了一個(gè)輸入的功能;從代碼上 EditText 是繼承自 TextView 的子類,所以我們可以大膽的理解為, EditText 是一種帶有輸入功能的高級(jí) TextView。
1. EditText 的特性
在學(xué)習(xí)過(guò) TextView 之后,EditText 就非常好理解了,它提供了一種文本輸入的方式,內(nèi)部可以支持單行或者多行輸入,并且提供一個(gè)浮標(biāo),讓用戶選擇輸入的位置,通常情況下點(diǎn)擊 EditText 會(huì)自動(dòng)展示出手機(jī)的輸入鍵盤?;叵胍幌?,我們前面在什么場(chǎng)景下有用到過(guò)?
2. EditText 的屬性
2.1 android:inputType
設(shè)置 EditText 的輸入類型,這樣用戶就只能按照你預(yù)設(shè)的規(guī)范進(jìn)行輸入。
作為用戶有沒(méi)有發(fā)現(xiàn)在登錄的時(shí)候,在密碼的輸入框輸入任何字符都會(huì)顯示成“*”或者“·”,然后輸入身份證的時(shí)候只能是數(shù)字加上“X”。這個(gè)功能就需要用到inputType屬性了,系統(tǒng)支持的可配置值如下:
- text
輸入文本類型 - textAutoComplete
文本自動(dòng)補(bǔ)全,類似在百度搜索框中搜索的時(shí)候,只需要輸入一兩個(gè)字會(huì)系統(tǒng)自動(dòng)幫你預(yù)測(cè)并補(bǔ)全剩余字符。 - textAutoCorrect
讓EditText對(duì)用戶的輸入進(jìn)行自動(dòng)矯正 - textPassword
輸入為密碼類型,會(huì)在輸入框中顯示“*”或者“·” - textUri
uri類型的文本 - textEmailAddress
email類型的文本 - phone
電話號(hào)碼類型,此模式下只支持輸入數(shù)字 - datetime
日期類型
以上是常用類型,除此之外還有很多很多,具體的屬性可以查閱官網(wǎng):inputType 類型列表
我們也可以同時(shí)設(shè)置多個(gè)屬性,只需要在多個(gè)屬性中間用“|”分隔,比如:
android:inputType="textCapSentences|textAutoCorrect"
2.2 android:imeOptions
這是一個(gè)非常好用的屬性,大家在用 Andorid 系統(tǒng)的時(shí)候應(yīng)該會(huì)發(fā)現(xiàn),在大多數(shù)輸入法的右下角,會(huì)留一個(gè)按鍵。當(dāng)你在聊天的時(shí)候,右下角按鍵是“發(fā)送”;當(dāng)你在登錄的時(shí)候,它會(huì)是“登錄”;當(dāng)你在填寫表格的時(shí)候,會(huì)是“下一頁(yè)”;當(dāng)你… …如何讓輸入法如此“智能”的跟隨場(chǎng)景變化,就需要用到 imeOptions 屬性了。
2.3 android:minLines
設(shè)置最小行數(shù)。通過(guò)設(shè)置 minLines 為 n,可以讓 EditText 的高度是 2 倍的行高,即使你沒(méi)有輸入任何字符,EditText 也會(huì)是2倍行高。
2.4 android:maxLines
設(shè)置 EditText 最大可容納的行數(shù)。如果設(shè)為 n,那么 EditText在輸入字符超過(guò) n 行之后高度就不會(huì)在自動(dòng)擴(kuò)張,而改為采用一個(gè)滾動(dòng)條的形式,通過(guò)拖動(dòng)滾動(dòng)條來(lái)查看前后的內(nèi)容,通常用這個(gè)屬性還限制 EditText 的最大高度。
2.5 android:hint
設(shè)置 EditText 提示符。如果 EditText 沒(méi)有輸入字符,會(huì)默認(rèn)顯示hint設(shè)置的字符,一旦有輸入則會(huì)清空 hint,通常用來(lái)提示用戶當(dāng)前 EditText 應(yīng)該輸入什么內(nèi)容。
2.6 android:maxLength
設(shè)置最大字符容量。這個(gè)比較好理解,就是限制用戶可以輸入多少個(gè)字符。
3. 通過(guò) xml 定義一個(gè) EditText
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/input_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請(qǐng)輸入密碼"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLines="5"
android:textSize="20sp" />
代碼比較簡(jiǎn)單,主要實(shí)現(xiàn)了以下幾個(gè)屬性:
- android:hint="請(qǐng)輸入密碼"
用來(lái)提示用戶,本輸入框的功能是輸入密碼,當(dāng)你點(diǎn)擊EditText往里面輸入字符之后,提示就會(huì)消失。 - android:inputType="textPassword"
設(shè)置當(dāng)前輸入的類為密碼,那么當(dāng)用戶輸入文本后,系統(tǒng)會(huì)用“*”或者“·”替代。 - android:maxLines="3"
設(shè)置當(dāng)前的輸入框最多使能容納3行內(nèi)人,如果多余 3 行,則會(huì)采用滾動(dòng)條的形式上下滑動(dòng)。
效果如下:
4. 獲取用戶的輸入信息
TextView 的功能只是作為信息輸出展示給用戶,而 EditText 除了可以展示信息之外,還需要從用戶那里得到輸入的內(nèi)容,我們可以通過(guò)getText().toString()
獲取到 EditText 的輸入信息。
修改一下布局文件,添加一個(gè) button 來(lái)觸發(fā)獲取的時(shí)機(jī):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="確定" />
<EditText
android:id="@+id/input_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_toLeftOf="@id/button"
android:hint="請(qǐng)輸入密碼"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLines="5"
android:textSize="20sp" />
</RelativeLayout>
我們?cè)诘谝粋€(gè)示例代碼基礎(chǔ)之上,加了一個(gè) Button,并放在了一個(gè) RelativeLayout 中(大家可以思考一下這里為什么要用 RelativeLayout,如果用 LinearLayout 能實(shí)現(xiàn)嗎?),我們希望用 Button 作為獲取 EditText 內(nèi)容的觸發(fā)事件,當(dāng)點(diǎn)擊 Button 的時(shí)候,我們獲取用戶在 EditText 中輸入的內(nèi)容,并打印到屏幕上驗(yàn)證結(jié)果。
相關(guān) Java 代碼如下:
final EditText editText = findViewById(R.id.input_password);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, editText.getText(), Toast.LENGTH_SHORT).show();
}
});
首先我們根據(jù) ID 拿到 EditText 和 Button 的實(shí)例,接著對(duì) Button 設(shè)置一個(gè)監(jiān)聽(tīng)器(關(guān)于 Button 監(jiān)聽(tīng)器的使用,如果不清楚可以參考后續(xù) Button 章節(jié),不是本節(jié)重點(diǎn)),在監(jiān)聽(tīng)器中我們獲取 EditText 的內(nèi)容,并通過(guò) Toast 打印到屏幕,效果如下:
擴(kuò)展:其實(shí)getText()
不是 EditText 特有的,TextView 也可以通過(guò)getText()
拿到顯示的內(nèi)容,只不過(guò) TextView 的內(nèi)容是由我們?cè)O(shè)置上去的,所以需要去獲取的場(chǎng)景比較少,用的也相對(duì)少。
5. 小結(jié)
EditText 是繼承自 TextView 的,所以基本上 TextView 所有的屬性及用法都可以適用于 EditText。本節(jié)介紹了 EditText 的一些最常見(jiàn)的用法,而 EditText 和 TextView 的高級(jí)用法和屬性非常多,也都大同小異,掌握了本節(jié)的內(nèi)容,未來(lái)如果需要用到高級(jí)用法相信你也能很快的舉一反三。