Android 文字輸入框 EditText
1. EditText 的特性
在學習過 TextView 之後,EditText 就非常好理解了,它提供了一種文字輸入的方式,內部可以支援單行或者多行輸入,並且提供一個浮標,讓使用者選擇輸入的位置,通常情況下點選 EditText 會自動展示出手機的輸入鍵盤。回想一下,我們前面在什麼場景下有用到過?
2. EditText 的屬性
2.1 android:inputType
設定 EditText 的輸入型別,這樣使用者就只能按照你預設的規範進行輸入。
作為使用者有沒有發現在登入的時候,在密碼的輸入框輸入任何字元都會顯示成“*”或者“·”,然後輸入身份證的時候只能是數字加上“X”。這個功能就需要用到inputType屬性了,系統支援的可配置值如下:
- text
輸入文字型別 - textAutoComplete
文字自動補全,類似在百度搜索框中搜索的時候,只需要輸入一兩個字會系統自動幫你預測並補全剩餘字元。 - textAutoCorrect
讓EditText對使用者的輸入進行自動矯正 - textPassword
輸入為密碼型別,會在輸入框中顯示“*”或者“·” - textUri
uri型別的文字 - textEmailAddress
email型別的文字 - phone
電話號碼型別,此模式下只支援輸入數字 - datetime
日期型別
以上是常用型別,除此之外還有很多很多,具體的屬性可以查閱官網:inputType 型別列表
我們也可以同時設定多個屬性,只需要在多個屬性中間用“|”分隔,比如:
android:inputType="textCapSentences|textAutoCorrect"
2.2 android:imeOptions
這是一個非常好用的屬性,大家在用 Andorid 系統的時候應該會發現,在大多數輸入法的右下角,會留一個按鍵。當你在聊天的時候,右下角按鍵是“傳送”;當你在登入的時候,它會是“登入”;當你在填寫表格的時候,會是“下一頁”;當你… …如何讓輸入法如此“智慧”的跟隨場景變化,就需要用到 imeOptions 屬性了。
2.3 android:minLines
設定最小行數。通過設定 minLines 為 n,可以讓 EditText 的高度是 2 倍的行高,即使你沒有輸入任何字元,EditText 也會是2倍行高。
2.4 android:maxLines
設定 EditText 最大可容納的行數。如果設為 n,那麼 EditText在輸入字元超過 n 行之後高度就不會在自動擴張,而改為採用一個滾動條的形式,通過拖動滾動條來檢視前後的內容,通常用這個屬性還限制 EditText 的最大高度。
2.5 android:hint
設定 EditText 提示符。如果 EditText 沒有輸入字元,會預設顯示hint設定的字元,一旦有輸入則會清空 hint,通常用來提示使用者當前 EditText 應該輸入什麼內容。
2.6 android:maxLength
設定最大字元容量。這個比較好理解,就是限制使用者可以輸入多少個字元。
3. 通過 xml 定義一個 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="請輸入密碼"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLines="5"
android:textSize="20sp" />
程式碼比較簡單,主要實現了以下幾個屬性:
- android:hint="請輸入密碼"
用來提示使用者,本輸入框的功能是輸入密碼,當你點選EditText往裡面輸入字元之後,提示就會消失。 - android:inputType="textPassword"
設定當前輸入的類為密碼,那麼當用戶輸入文字後,系統會用“*”或者“·”替代。 - android:maxLines="3"
設定當前的輸入框最多使能容納3行內人,如果多餘 3 行,則會採用滾動條的形式上下滑動。
效果如下:
4. 獲取使用者的輸入資訊
TextView 的功能只是作為資訊輸出展示給使用者,而 EditText 除了可以展示資訊之外,還需要從使用者那裡得到輸入的內容,我們可以通過getText().toString()
獲取到 EditText 的輸入資訊。
修改一下佈局檔案,新增一個 button 來觸發獲取的時機:
<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="請輸入密碼"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLines="5"
android:textSize="20sp" />
</RelativeLayout>
我們在第一個示例程式碼基礎之上,加了一個 Button,並放在了一個 RelativeLayout 中(大家可以思考一下這裡為什麼要用 RelativeLayout,如果用 LinearLayout 能實現嗎?),我們希望用 Button 作為獲取 EditText 內容的觸發事件,當點選 Button 的時候,我們獲取使用者在 EditText 中輸入的內容,並列印到螢幕上驗證結果。
相關 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();
}
});
首先我們根據 ID 拿到 EditText 和 Button 的例項,接著對 Button 設定一個監聽器(關於 Button 監聽器的使用,如果不清楚可以參考後續 Button 章節,不是本節重點),在監聽器中我們獲取 EditText 的內容,並通過 Toast 列印到螢幕,效果如下:
擴充套件:其實getText()
不是 EditText 特有的,TextView 也可以通過getText()
拿到顯示的內容,只不過 TextView 的內容是由我們設定上去的,所以需要去獲取的場景比較少,用的也相對少。
5. 小結
EditText 是繼承自 TextView 的,所以基本上 TextView 所有的屬性及用法都可以適用於 EditText。本節介紹了 EditText 的一些最常見的用法,而 EditText 和 TextView 的高階用法和屬性非常多,也都大同小異,掌握了本節的內容,未來如果需要用到高階用法相信你也能很快的舉一反三。