文本域(TextFields)

文本控件允许用户在你的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指定的输入类型:

  • “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" />

指定键盘动作

除了改变键盘的输入类型, 还可以改变键盘的操作,比如你这是一个用于搜索框的键盘,还是用于聊天框的键盘,完成的动作会有所区别, 搜索框的可能会有一个搜索按钮, 而聊天框会有一个发送按钮.

我们可以通过指定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从一个数组中获取数据:

  • 首先在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" />
  • 定义一个数组, 包含所有我们需要的提示词汇,下面是一个在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>
  • 在我们的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.

Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1