文本控件允许用户在你的app中打字。它可以是单行的,也可以是多行的。触摸文本控件所占的空间会显示光标并且自动弹出软键盘。除了打字之外,文本控件允许各种其它活动,如文本选择(剪切,复制,黏贴)和由自动完成功能(auto-completion.)提供的数据查询。
通过包含 EditText 对象,在你的布局文件中添加一个文本控件,也可以在你的xml布局文件中添加<EditText>
元素来添加。
文本控件有许多不同的输入类型,如数字,日期,密码或邮箱地址。输入类型决定了何种字符被允许键入文本内,如果频繁使用字符,可以优化虚拟键盘的布局。
你可以指定软键盘的类型,在EditText对象中的android:inputType属性。例如,如果你想要用户输入的是邮箱地址,你可以使用textEmailAddress输入类型:
<EditText
android:id="@+id/email_address"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/email_hint"
android:inputType="textEmailAddress" />
不同的输入类型会弹出不同种类的键盘, 这是一些常见的通过android:inputType指定的输入类型:
"textUri": 在普通文本键盘的基础上增加”/”符号.
“number”: 基本数字键盘.
“phone”: 电话样式键盘.
android:inputType还可以指定键盘的其它功能,比如是否启动自动完成和拼写建议等.下面是一些常用的控制键盘行为的参数:
"textCapSentences": 普通文本键盘, 每个句子第一个字母大写.
"textCapWords": 普通文本键盘, 每个字母都大写, 适用于标题或者人名.
"textAutoCorrect": 普通文本键盘, 会自动纠正常见的拼写错误.
"textPassword": 普通文本键盘, 但是每个字符会变成点号.
"textMultiLine": 普通文本键盘, 但是可以包括换行符.
多个属性可以使用”|”连接, 比如这里是一个邮寄地址, 每个字母大写, 并且没有自动纠正功能:
<EditText
android:id="@+id/postal_address"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/postal_address_hint"
android:inputType="textPostalAddress|
textCapWords|
textNoSuggestions" />
除了改变键盘的输入类型, 还可以改变键盘的操作,比如你这是一个用于搜索框的键盘,还是用于聊天框的键盘,完成的动作会有所区别, 搜索框的可能会有一个搜索按钮, 而聊天框会有一个发送按钮.
我们可以通过指定android:imeOptions属性来指定这一特性. 比如这里是如何指定”发送”键盘:
<EditText
android:id="@+id/search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/search_hint"
android:inputType="text"
android:imeOptions="actionSend" />
如果我们不指定任何的imeOpotions的话,Android会自动识别,是否存在下一个可以获得焦点的文本框,如果有的话,Android会指定当前文本框的imeOptions为”actionNext”,这时候用户可以通过点击键盘上的Next来获取下一个焦点.如果没有下一个可以获得焦点的文本框, 那么imeOptions会被指定为”actionDone”.我们可以重写这一属性使用比如”actionSend”,“actionSearch”或者”actionNone”.
如果我们指定了android:imeOptions属性(比如actionSend),那么就可以通过TextView.onEditorActionListener来监听键盘的Send按钮被按下的事件,TextView.onEditorActionListener提供了一个onEditorAction()的回调方法,当Send按钮被按下的时候, 该方法会收到一个IME_ACTION_SEND参数, 比如下面是一个监听的栗子:
EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
boolean handled = false;
if (actionId == EditorInfo.IME_ACTION_SEND) {
sendMessage();
handled = true;
}
return handled;
}
});
如果键盘太大而不能合理的占用应用下方的空间时(如,当手机设备处于横向时)就会开启全屏。在该模式下(全屏),一个被标记的操作按钮显示在了输入框的旁边。你可以自定义这个按钮上的文本,通过设置android:imeActionLabel 属性。
<EditText
android:id="@+id/launch_codes"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/enter_launch_codes"
android:inputType="number"
android:imeActionLabel="@string/launch" />
另外的一些操作可以通过android:imeOptions属性指定,你可以添加额外的标志来指定其它键盘行为。所有可用的标志都在文件android:imeOptions中列出。
例如,上5展示了如何使系统全屏显示文本字段,当手机处于横向(或屏幕空间受限)。你可以禁用全屏输入模式,通过 android:imeOptions属性的flagNoExtractUi 值,如下图所示。
如果我们希望让TextFiled可以为用户提供输入建议,那么我们可以使用AutoCompleteTextView类,它是TextView类的子类, 为了实现这个功能, 我们必须实现一个Adapter.根据数据源的不同,我们有几种Adapter可以选择,比如从数据库选择或者从一个数组选择. 这是AutoCompleteTextView工作的时候的样子:
下面的栗子描述了AutoCompleteTextView如何通过ArrayAdapter从一个数组中获取数据:
<?xml version="1.0" encoding="utf-8"?>
<AutoCompleteTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/autocomplete_country"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="countries_array">
<item>Afghanistan</item>
<item>Albania</item>
<item>Algeria</item>
<item>American Samoa</item>
<item>Andorra</item>
<item>Angola</item>
<item>Anguilla</item>
<item>Antarctica</item>
...
</string-array>
</resources>
// Get a reference to the AutoCompleteTextView in the layout
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country);
// Get the string array
String[] countries = getResources().getStringArray(R.array.countries_array);
// Create the adapter and set it to the AutoCompleteTextView
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, countries);
textView.setAdapter(adapter);
首先读取资源文件中的string数组,存在countries中,然后通过该数据创建adapter,最后将adapter传给AutoCompleteTextView.