概述:
文本框, 允许用户输入文本, 可以为单行或则多行, 点击一个文本框之后它会得到焦点, 然后会自动弹出键盘, 文本框还支持复制粘贴等操作.
我们可以通过添加一个<EditText>标签来为我们的layout增加一个文本框.
为文本框指定一个键盘类型:
每个文本框都可以指定不同的输入文本类型, 比如数字, 日期, 密码或者邮件等. 我们可以通过EditText的android:inputType属性来指定键盘的类型, 比如如果我们需要一个接收Email的文本框, 那么我们应该使用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指定的输入类型:
“text”: 普通文本, 键盘这样:
“textEmailAddress”: 在普通文本键盘的基础上增加了@符号:
"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" />
更多的inputType可以参考这里.
指定键盘动作:
除了改变键盘的输入类型, 还可以改变键盘的操作, 比如你这是一个用于搜索框的键盘, 还是用于聊天框的键盘, 完成的动作会有所区别, 搜索框的可能会有一个搜索按钮, 而聊天框会有一个发送按钮.
我们可以通过指定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;
}
});
TextFiled自动完成:
如果我们希望让TextFiled可以为用户提供输入建议, 那么我们可以使用AutoCompleteTextView 类, 它是TextView类的子类, 为了实现这个功能, 我们必须实现一个Adapter. 根据数据源的不同, 我们有几种Adapter可以选择, 比如从数据库选择或者从一个数组选择. 这是AutoCompleteTextView工作的时候的样子:
下面的栗子描述了AutoCompleteTextView如何通过ArrayAdapter从一个数组中获取数据:
1. 首先在layout文件中添加一个AutoCompleteTextView:
<?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" />
2. 定义一个数组, 包含所有我们需要的提示词汇, 下面是一个在XML资源文件(res/values/string.xml)中定义的国家名字的字符串数组:
<?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>
3. 在我们的Activity或者fragment的代码中, 关联数据, ArrayAdapter和AutoCompleteTextView:
// 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.
参考: http://developer.android.com/guide/topics/ui/controls/text.html