1. 程式人生 > Android入門教學 >Android 文字輸入框 EditText

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 行,則會採用滾動條的形式上下滑動。
    效果如下:

EditText示例

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 列印到螢幕,效果如下:

獲取EditText內容

擴充套件:其實getText()不是 EditText 特有的,TextView 也可以通過getText()拿到顯示的內容,只不過 TextView 的內容是由我們設定上去的,所以需要去獲取的場景比較少,用的也相對少。

5. 小結

EditText 是繼承自 TextView 的,所以基本上 TextView 所有的屬性及用法都可以適用於 EditText。本節介紹了 EditText 的一些最常見的用法,而 EditText 和 TextView 的高階用法和屬性非常多,也都大同小異,掌握了本節的內容,未來如果需要用到高階用法相信你也能很快的舉一反三。