1page.title=Text Fields 2parent.title=Input Controls 3parent.link=../controls.html 4@jd:body 5 6<div id="qv-wrapper"> 7<div id="qv"> 8 9<h2>In this document</h2> 10<ol> 11 <li><a href="#Keyboard">Specifying the Keyboard Type</a> 12 <ol> 13 <li><a href="#Behaviors">Controlling other behaviors</a></li> 14 </ol> 15 </li> 16 <li><a href="#Actions">Specifying Keyboard Actions</a> 17 <ol> 18 <li><a href="#ActionEvent">Responding to action button events</a></li> 19 <li><a href="#ActionLabel">Setting a custom action button label</a></li> 20 </ol> 21 </li> 22 <li><a href="#Flags">Adding Other Keyboard Flags</a></li> 23 <li><a href="#AutoComplete">Providing Auto-complete Suggestions</a></li> 24</ol> 25<h2>Key classes</h2> 26<ol> 27 <li>{@link android.widget.EditText}</li> 28 <li>{@link android.widget.AutoCompleteTextView}</li> 29</ol> 30 31</div> 32</div> 33 34<p>A text field allows the user to type text into your app. It can be either single line or 35multi-line. Touching a text field places the cursor and automatically displays the keyboard. In 36addition to typing, text fields allow for a variety of other activities, such as text selection 37(cut, copy, paste) and data look-up via auto-completion.</p> 38 39<p>You can add a text field to you layout with the {@link android.widget.EditText} object. You 40should usually do so in your XML layout with a {@code <EditText>} element.</p> 41 42<img src="{@docRoot}images/ui/edittext-noextract.png" alt="" /> 43 44 45 46<h2 id="Keyboard">Specifying the Keyboard Type</h2> 47 48<div class="figure" style="width:300px;margin-top:0"> 49<img src="{@docRoot}images/ui/edittext-text.png" alt="" /> 50<p class="img-caption"><strong>Figure 1.</strong> The default {@code text} input type.</p> 51</div> 52 53<div class="figure" style="width:300px"> 54<img src="{@docRoot}images/ui/edittext-email.png" alt="" /> 55<p class="img-caption"><strong>Figure 2.</strong> The {@code textEmailAddress} input type.</p> 56</div> 57 58<div class="figure" style="width:300px"> 59<img src="{@docRoot}images/ui/edittext-phone.png" alt="" /> 60<p class="img-caption"><strong>Figure 3.</strong> The {@code phone} input type.</p> 61</div> 62 63<p>Text fields can have different input types, such as number, date, password, or email address. The 64type determines what kind of characters are allowed inside the field, and may prompt the virtual 65keyboard to optimize its layout for frequently used characters.</p> 66 67<p>You can specify the type of keyboard you want for your {@link android.widget.EditText} object 68with the <a href="{@docRoot}reference/android/widget/TextView.html#attr_android:inputType">{@code 69android:inputType}</a> attribute. For example, if you want the user to input an email address, you 70should use the {@code textEmailAddress} input type:</p> 71 72<pre> 73<EditText 74 android:id="@+id/email_address" 75 android:layout_width="fill_parent" 76 android:layout_height="wrap_content" 77 android:hint="@string/email_hint" 78 android:inputType="textEmailAddress" /> 79</pre> 80 81 82<p>There are several different input types available for different situations. You can find 83them all listed with the documentation for <a 84href="{@docRoot}reference/android/widget/TextView.html#attr_android:inputType">{@code 85android:inputType}</a>.</p> 86 87<p class="note"><strong>Tip:</strong> To allow users to input long strings of text with line 88breaks, use the {@code "textMultiLine"} input type. By default, an {@link android.widget.EditText} 89object is restricted to one line of text and scrolls horizontally when the text exceeds the 90available width.</p> 91 92 93<h3 id="Behaviors">Controlling other behaviors</h3> 94 95<p>The <a href="{@docRoot}reference/android/widget/TextView.html#attr_android:inputType">{@code 96android:inputType}</a> also allows you to specify certain keyboard behaviors, such as whether to 97capitalize all new words or use features like auto-complete and spelling suggestions.</p> 98 99<p>The <a href="{@docRoot}reference/android/widget/TextView.html#attr_android:inputType">{@code 100android:inputType}</a> attribute allows bitwise combinations so you can specify both a keyboard 101layout and one or more behaviors at once. For example, here's how you can collect a postal 102address, capitalize each word, and disable text suggestions:</p> 103 104<pre> 105<EditText 106 android:id="@+id/postal_address" 107 android:layout_width="fill_parent" 108 android:layout_height="wrap_content" 109 android:hint="@string/postal_address_hint" 110 android:inputType="textPostalAddress| 111 textCapWords| 112 textNoSuggestions" /> 113</pre> 114 115<p>All behaviors are also listed with the <a 116href="{@docRoot}reference/android/widget/TextView.html#attr_android:inputType">{@code 117android:inputType}</a> documentation.</p> 118 119 120<h2 id="Actions">Specifying Keyboard Actions</h2> 121 122<div class="figure" style="width:300px"> 123<img src="{@docRoot}images/ui/edittext-actionsend.png" alt="" /> 124<p class="img-caption"><strong>Figure 4.</strong> If you declare {@code 125android:imeOptions="actionSend"}, the keyboard includes the Send action.</p> 126</div> 127 128<p>In addition to changing the keyboard's input type, Android allows you to specify an action to be 129made when users have completed their input. The action specifies the button that appears in place of 130the carriage return key and the action to be made, such as "Search" or "Send."</p> 131 132<p>You can specify the action by setting the <a 133href="{@docRoot}reference/android/widget/TextView.html#attr_android:imeOptions">{@code 134android:imeOptions}</a> attribute. For example, here's how you can specify the Send action:</p> 135 136<pre> 137<EditText 138 android:id="@+id/search" 139 android:layout_width="fill_parent" 140 android:layout_height="wrap_content" 141 android:hint="@string/search_hint" 142 android:inputType="text" 143 android:imeOptions="actionSend" /> 144</pre> 145 146<p>If you do not explicitly specify an input action then the system attempts to determine if there 147are any subsequent <a 148href="{@docRoot}reference/android/view/View.html#attr_android:focusable">{@code 149android:focusable}</a> fields. If any focusable fields are found following this one, the system 150applies the (@code actionNext} action to the current {@link android.widget.EditText} so the user can 151select Next to move to the next field. If there's no subsequent focusable field, the system applies 152the {@code "actionDone"} action. You can override this by setting the <a 153href="{@docRoot}reference/android/widget/TextView.html#attr_android:imeOptions">{@code 154android:imeOptions}</a> attribute to any other value such as {@code "actionSend"} or {@code 155"actionSearch"} or suppress the default behavior by using the {@code "actionNone"} action.</p> 156 157 158<h3 id="ActionEvent">Responding to action button events</h3> 159 160<p>If you have specified a keyboard action for the input method using <a 161href="{@docRoot}reference/android/widget/TextView.html#attr_android:imeOptions">{@code 162android:imeOptions}</a> attribute (such as {@code "actionSend"}), you can listen for the specific 163action event using an {@link android.widget.TextView.OnEditorActionListener}. The {@link 164android.widget.TextView.OnEditorActionListener} interface provides a callback method called {@link 165android.widget.TextView.OnEditorActionListener#onEditorAction onEditorAction()} that indicates the 166action type invoked with an action ID such as {@link 167android.view.inputmethod.EditorInfo#IME_ACTION_SEND} or {@link 168android.view.inputmethod.EditorInfo#IME_ACTION_SEARCH}.</p> 169 170<p>For example, here's how you can listen for when the user clicks the Send button on the 171keyboard:</p> 172 173<pre> 174EditText editText = (EditText) findViewById(R.id.search); 175editText.setOnEditorActionListener(new OnEditorActionListener() { 176 @Override 177 public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 178 boolean handled = false; 179 if (actionId == EditorInfo.IME_ACTION_SEND) { 180 // Send the user message 181 handled = true; 182 } 183 return handled; 184 } 185}); 186</pre> 187 188 189<h3 id="ActionLabel">Setting a custom action button label</h3> 190 191<p>If the keyboard is too large to reasonably share space with the underlying application (such as 192when a handset device is in landscape orientation) then fullscreen ("extract mode") is triggered. In 193this mode, a labeled action button is displayed next to the input. You can customize the text of 194this button by setting the <a 195href="{@docRoot}reference/android/widget/TextView.html#attr_android:imeActionLabel">{@code 196android:imeActionLabel}</a> attribute:</p> 197 198<pre> 199<EditText 200 android:id="@+id/launch_codes" 201 android:layout_width="fill_parent" 202 android:layout_height="wrap_content" 203 android:hint="@string/enter_launch_codes" 204 android:inputType="number" 205 android:imeActionLabel="@string/launch" /> 206</pre> 207 208<img src="{@docRoot}images/ui/edittext-actionlabel.png" alt="" /> 209<p class="img-caption"><strong>Figure 5.</strong> A custom action label with <a 210href="{@docRoot}reference/android/widget/TextView.html#attr_android:imeActionLabel">{@code 211android:imeActionLabel}</a>.</p> 212 213 214 215<h2 id="Flags">Adding Other Keyboard Flags</h2> 216 217<p>In addition to the actions you can specify with the <a 218href="{@docRoot}reference/android/widget/TextView.html#attr_android:imeOptions">{@code 219android:imeOptions}</a> attribute, you can add additional flags to specify other keyboard 220behaviors. All available flags are listed along with the actions in the <a 221href="{@docRoot}reference/android/widget/TextView.html#attr_android:imeOptions">{@code 222android:imeOptions}</a> documentation.</p> 223 224<p>For example, figure 5 shows how the system enables a fullscreen text field when a handset device 225is in landscape orientation (or the screen space is otherwise constrained for space). You can 226disable the fullscreen input mode with {@code flagNoExtractUi} in the <a 227href="{@docRoot}reference/android/widget/TextView.html#attr_android:imeOptions">{@code 228android:imeOptions}</a> attribute, as shown in figure 6.</p> 229 230<img src="{@docRoot}images/ui/edittext-noextract.png" alt="" /> 231<p class="img-caption"><strong>Figure 6.</strong> The fullscreen text field ("extract mode") is 232disabled with {@code android:imeOptions="flagNoExtractUi"}.</p> 233 234 235 236 237<h2 id="AutoComplete">Providing Auto-complete Suggestions</h2> 238 239<p>If you want to provide suggestions to users as they type, you can use a subclass of {@link 240android.widget.EditText} called {@link android.widget.AutoCompleteTextView}. To implement 241auto-complete, you must specify an (@link android.widget.Adapter) that provides the text 242suggestions. There are several kinds of adapters available, depending on where the data is coming 243from, such as from a database or an array.</p> 244 245<img src="{@docRoot}images/ui/edittext-autocomplete.png" alt="" /> 246<p class="img-caption"><strong>Figure 7.</strong> Example of {@link 247android.widget.AutoCompleteTextView} with text suggestions.</p> 248 249<p>The following procedure describes how to set up an {@link android.widget.AutoCompleteTextView} 250that provides suggestions from an array, using {@link android.widget.ArrayAdapter}: 251 252<ol> 253 <li>Add the {@link android.widget.AutoCompleteTextView} to your layout. Here's a 254layout with only the text field: 255<pre> 256<?xml version="1.0" encoding="utf-8"?> 257<AutoCompleteTextView xmlns:android="http://schemas.android.com/apk/res/android" 258 android:id="@+id/autocomplete_country" 259 android:layout_width="fill_parent" 260 android:layout_height="wrap_content" /> 261</pre> 262</li> 263 264<li>Define the array that contains all text suggestions. For example, here's an array of country 265names that's defined in an XML resource file ({@code res/values/strings.xml}): 266<pre> 267<?xml version="1.0" encoding="utf-8"?> 268<resources> 269 <string-array name="countries_array"> 270 <item>Afghanistan</item> 271 <item>Albania</item> 272 <item>Algeria</item> 273 <item>American Samoa</item> 274 <item>Andorra</item> 275 <item>Angola</item> 276 <item>Anguilla</item> 277 <item>Antarctica</item> 278 ... 279 </string-array> 280</resources> 281</pre> 282</li> 283 284<li>In your {@link android.app.Activity} or {@link android.app.Fragment}, use the following 285code to specify the adapter that supplies the suggestions: 286<pre> 287// Get a reference to the AutoCompleteTextView in the layout 288AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country); 289// Get the string array 290String[] countries = getResources().getStringArray(R.array.countries_array); 291// Create the adapter and set it to the AutoCompleteTextView 292ArrayAdapter<String> adapter = 293 new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, countries); 294textView.setAdapter(adapter); 295</pre> 296 297<p>Here, a new {@link 298android.widget.ArrayAdapter} is initialized to bind each item in the <code>COUNTRIES</code> 299string array to a {@link android.widget.TextView} that exists in the {@code simple_list_item_1} 300layout (this is a layout provided by Android that provides a standard appearance for text in a 301list).</p> 302<p>Then assign the adapter to the {@link android.widget.AutoCompleteTextView} by 303calling {@link android.widget.AutoCompleteTextView#setAdapter setAdapter()}.</p> 304</li> 305</ol> 306 307