情境
如果想要讓使用者輸入一些文字,並且讓使用者能繼續修改或刪除的介面,又或者可以使用者輸入密碼並且顯示隱藏,EditText是一個很適合的元件。
說明
EditText可以在你的程式內讓使用者輸入一些訊息,可以以單行或多行的模式顯示,點擊輸入框的時候,系統會自動跳出鍵盤讓使用者進行輸入,它擁有一些內建的功能,例如長按會跳出系統內建的複製、剪下或貼上等功能,也可以讓使用者進行移動位置來編輯,是一個非常強大的內建元件。
程式碼解說
方法一
你可以直接在程式碼內宣告,只要給定當前的 Layout id,取得Layout的實體,就可以透過new的方式把一個EditText加到目前的Activtiy了。
- MainActivity 內新增不需再 XML 內宣告。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val editText = EditText(this)
container.addView(editText)
}
}
就會看到以下的畫面。
方法二
當然這樣的方式比較不推薦,因為佈局會變得難以控制,加上如果元件一多,實際上在管理會很不方便,所以比較好的做法是寫在XML內。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.givemepass.edittextdemo.MainActivity">
<EditText
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
這樣也可以完成如下圖的畫面,基本上跟用程式碼建置是相同的,在這邊多加了一個 background 的參數,可以設定EditText的外框,這邊選用android內建的外框,因此 style 會隨著 android 版本不同而有不一樣的外觀。
功能參數說明
- hint 提示
你可以使用 android:hint 的方式來提示使用者該輸入哪類型的資料,當使用者輸入一個以上的文字就會消失。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText android:hint="請輸入名字"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
- android:inputType 可以讓你選擇使用者能夠輸入甚麼樣的資料,取幾個比較常用的來說明。
android:inputType="text"
: 任何鍵盤上的字都可以。
<EditText
android:hint="請輸入名字"
android:inputType="text"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
`android:inputType="number"`: 只能數字。
<EditText
android:hint="請輸入數字"
android:inputType="number"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
你會看到鍵盤上只跳出數字讓你輸入。
android:inputType="textPassword"
: 輸入密碼。
<EditText
android:hint="請輸入密碼"
android:inputType="textPassword"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
你會看到輸入完的文字過沒多久就被遮蔽。
android:inputType="textCapSentences|textPassword"
:你也可以把效果用 | 符號串起來。
<EditText
android:hint="請輸入密碼"
android:inputType="textCapSentences|textPassword"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
android:imeOptions
:可以讓你輸入文字完, 鍵盤出現某些選項的按鈕。
你可以看到 Android Studio 出現很多選項。
例如 ActionSend。
<EditText
android:hint="請輸入密碼"
android:imeOptions="actionSend"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
而有些手機鍵盤是該手機廠商客製的,並不會顯示Send的按鈕,沒關係你可以切換到 landscape 的模式,它就會出現在EditText的旁邊,如以下的畫面。
當然你也可以指定上面出現的字是什麼,只要透過 android:imeActionLabel
這個屬性就可以設定。
<EditText
android:imeActionLabel="launch"
android:hint="請輸入密碼"
android:imeOptions="actionSend"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
一樣如果手機廠商客製化的鍵盤沒有 Lanch 按鈕,可以切到 landscape 的模式去看就會出現下圖。
如果你指定了 android:imeOptions
屬性,那麼就可以對它設定 Listener 如下面的範例,首先對 xml 的 EditText 指定 ID。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.givemepass.edittextdemo.MainActivity">
<EditText
android:id="@+id/password"
android:imeActionLabel="launch"
android:hint="請輸入密碼"
android:imeOptions="actionSend"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
再從MainActivity內將元件設定事件,事件的id可以參照下方連結去偵測,
https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html
例如我設定為 actionSend 那麼 ID 就是 EditorInfo.IME_ACTION_SEND。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
password.setOnEditorActionListener { _, actionId, _ ->
var handled = false
if (actionId == EditorInfo.IME_ACTION_SEND) {
Toast.makeText(this@MainActivity, "send", Toast.LENGTH_SHORT).show()
handled = true
}
handled
}
}
}
你就會看到下圖按下 launch 就跳出 Toast。
假設你有多個 EditText,你可以透過 android:imeOptions="actionNext"
,按下一個來達到自動去尋找下一個 EditText。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.givemepass.edittextdemo.MainActivity">
<EditText
android:id="@+id/name"
android:hint="請輸入名字"
android:imeOptions="actionNext"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/password"
android:imeActionLabel="launch"
android:hint="請輸入密碼"
android:imeOptions="actionSend"
android:background="@android:drawable/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
就會看到如下圖所操作,直接跳到下一格。
除了這些功能以外,Android 還提供另外一個方便的元件叫做 AutoCompleteTextView
,可以參考如何使用AutoCompleteTextView(自動提示),以上就是一個簡單的EditText操作。